Introduction

The results below shows the comparison of several normalization and imputation methods. We decided to use 4 imputation methods:

  1. Shifted Distribution based on the data;
  2. Imputation using the Random Forest algorithm;
  3. Imputation using the k-Nearest Neighbors algorithm;
  4. Imputation using the ludovic method.

and 8 normalization methods:

  1. Z-Score Normalization
  2. Min-Max Normalization
  3. Median Scaling
  4. MAD (Median Absolute Deviation) Scaling
  5. Linear Regression Normalization
  6. VSN (Variance Stabilization Normalization)
  7. EigenMS

We selected the following features to train the machine learning models:

  • Sequence coverage - percentage of the sequence that is covered by the identified peptides of the first protein sequence contained in the group;
  • Sequence length - the length of the leading protein sequence contained in the group;
  • Mol weigth kDa - molecular weight of the leading protein sequence contained in the protein group;
  • Qvalue - the ratio of reverse to forward protein groups;
  • Score - Protein score which is derived from peptide posterior error probabilities
  • MS/MS Count - the number of tandem MS scans that were made based on this full scan (e.g. a top 10 method selects the top 10 most intense ions in the scan and fragments those).
  • LFQ values for TOTALS (KO 22/23/24 and WT 22/23/24) - target
  • Based on the column names of tje LFQ values, we created 2 more features:
    1. celltype - Knockout (KO) or Wild Type (WT) - for kNN encoded as (1:KO, 2:WT)
    2. rep - replicates (22, 23 or 24) - for kNN encoded as (1:22, 2:23, 3:24)

We used the following parameters for the K-Nearest Neighbors algorithm (bold row):

k RMSE Rsquared MAE
5 560141411 0.5764903 83499878
7 586141572 0.5110148 89345187
9 615649021 0.4549313 93976048

For the Random Forest algorithm we used the Grid Search method to find the best hyperparameters. The table belows shows the output of the top 10 models.

GRID SEARCH FOR RANDOM FOREST MODEL


num.trees mtry min.node.size replace sample.fraction rmse perc_gain
1 100 4 5 false 0.8 36184321.6466 2.8631
2 500 4 5 false 0.8 367032968.8757 1.4713
3 300 4 5 false 0.8 367963900.30284 1.2214
4 500 4 1 true 0.8 370084110.1524 0.6523
5 500 4 10 false 0.8 370380581.2619 0.5727
6 300 4 1 true 0.63 371446664.9562 0.2865
7 100 4 5 false 0.8 372131148.9947 0.1027
8 300 4 10 false 0.8 372169999.3198 0.0923
9 300 4 4 true 0.63 372767670.8139 -0.0681
10 300 4 3 true 0.8 373586116.5828 -0.2878

Base on the output of the grid search, we can see that there is better model than default and it is random forest model with the following hyperparameters:

  • num.trees = 100
  • mtry = 4
  • min.node.size = 5
  • replace = FALSE
  • sample.fraction = 0.80

We train Linear Regression Model which, after the stepwise selection, has the following formula:

\[LFQvalue = 8631815 \cdot no.proteins -18172773 \cdot peptides + 1794237 \cdot seq.coverage +\\ + 807933 \cdot mol.weight.kDa + 430143 \cdot score + 1490175 \cdot ms.count\]

Where:

  • no.proteins - Number of proteins contained within the group.
  • peptides - The total number of peptide sequences associated with the protein group (i.e. for all the proteins in the group).
  • seq.coverage - Percentage of the sequence that is covered by the identified peptides of the first protein sequence contained in the group.
  • mol.wieght.kDa - Molecular weight of the leading protein sequence contained in the protein group.
  • score - Andromeda score for the best associated MS/MS spectrum.
  • ms.count - The number of MS/MS spectra recorded in this raw file.

We train and compare 4 machine learning models and based on the performance (table below), we decided to use 2 of them:

  1. Random Forest
  2. kNN
Model NRMSE MSE RMSE MAE R2
RF 0.5724 0.8044 0.8969 0.6663 0.7615
kNN 0.6070 1.0182 1.0091 0.7590 0.6701
LM 0.8737 3.8825 1.9704 1.6091 0.2623
PCA 1 6.8863 2.6242 2.2380 0

For the Ludovic method first we had to assign the missing values using the protti::assign_missingness() fxn, which added the comparison column containing the comparison name for the specific treatment/reference pair and the missingness column with 4 types of missingness:

  • "complete": No missing values for every replicate of this reference/treatment pair for the specific grouping variable.
  • "MNAR": Missing not at random. All replicates of either the reference or treatment condition have missing values for the specific grouping variable.
  • "MAR": Missing at random. At least n-1 replicates have missing values for the reference/treatment pair for the specific grouping variable.
  • NA: The comparison is not complete enough to fall into any other category. It will not be imputed if imputation is performed.

Then with additional column we could enter our data into protti::impute() fxn, which performs the Ludovic imputation method based on the missingness column using the following instructions:

  • "MNAR" missingness is sampled from a normal distribution around a value that is three lower (log2) than the lowest intensity value recorded for the precursor/peptide and that has a spread of the mean standard deviation for the precursor/peptide.
  • "MAR" data is imputed using the mean and variance of the condition with the missing data.
  • NA data is not imputed.

Distributions

Summary
Below we can see the distribution of non-imputed data and data imputed with 4 methods:

  1. Shifted Distribution based on the data;
  2. Imputation using the Random Forest algorithm;
  3. Imputation using the k-Nearest Neighbors algorithm;
  4. Imputation using the ludovic method.

For each histogram, we can see that the 24th replicate (blue colour) of the KO cell type has a distribution shift to the right. Our goal is to get this distribution closer to the others, and we can do this using different normalization methods.

Mati Code

Random Forest

k-Nearest Neighbors

Ludovic

Normalization

The 24th replicate of the KO cell type has the distribution shifted to the right and should be more similar to the other replicates. Therefore we tried several normalization methods to achieve this goal. We used the following methods:

  1. Z-Score
  2. Min-Max
  3. Median Scaling
  4. MAD (Median Absolute Deviation) Scaling
  5. Linear Regression
  6. VSN (Variance Stabilization Normalization)
  7. EigenMS

Z-Score

Z-score normalization standardizes data by subtracting the mean and dividing by the standard deviation. This technique transforms data into a distribution with a mean of 0 and a standard deviation of 1.

Formula: \(\tilde{y}_{ij} = \frac{y_ij - \bar{y_j}}{\theta_j}\), where:

  • \(y_ij\) - value of the LFQ;
  • \(\bar{y_j}\) - mean of the LFQ values;
  • \(\theta_j\) - standard deviation of the LFQ values.

Summary
The Z-SCORE method brought the distribution closer together, but we lost the original scale of the data and the differences are harder to see after normalization.

DISTRIBUTIONS

Min-Max

Min-max normalization scales data to a specified range (usually [0, 1]) by subtracting the minimum value and dividing by the range of values.

Summary
The MIN-MAX method didn’t succeed in bringing the distribution closer together. In conclusion, we probably shouldn’t use this method.

DISTRIBUTIONS

Median Scaling

Median Scaling, also called the Robust Scalar, transforms x to x’ by subtracting each value of features by the median and dividing it by the interquartile range between the 1st quartile (25th quantile) and the 3rd quartile (75th quantile). The formula:

\[x' = \frac{x-median(x)}{(Q3-Q1)}\]

Summary
The MEDIAN scaling method brought the distributions closer together, but again we lost the original scale of the data and the differences are harder to see after normalization.

DISTRIBUTIONS

MAD Scaling

MAD (Median Absoulte Deviation) Scaling transforms \(x\) to \(x'\) in similar way like Median Scaling, but it substractingthe MAD value from the \(x\). The formula of MAD:

\[\tilde{X} = median(X) \\ MAD = median\Big(|X_i - \tilde{X}|\Big)\]

and the formula of scaling is:

\[x' = \frac{x - MAD}{(Q3-Q1)}\]

Summary
The MAD scaling method brought the distributions closer together, but again we lost the original scale of the data and the differences are harder to see after normalization.

DISTRIBUTIONS

Linear Regression

Normalization by linear regression using a residual of the linear model \(y = ax + b\) to normalize the data. In our project we have two variables: independent and dependent. The independent variable is Batch and the dependent variable is LFQ.

Summary
The linear regression method brought the distributions closer together, but again we lost the original scale of the data and the differences are harder to see after normalization.

DISTRIBUTIONS

VSN

VSN - Variance Stabilization Normalization

The data are returned on a \(glog\) scale to base 2. More precisely, the transformed data are subject to the transformation \(glog_2(f(b)*x+a)+c\), where the function \(glog_2(u)=log_2(u+\sqrt{u*u+1}) = asinh(u)/log(2)\) is called the generalised logarithm, the offset \(a\) and the scaling parameter \(b\) are the fitted model parameters (see references), and \(f(x)=exp(x)\) is a parameter transformation that allows ensuring positivity of the factor in front of x while using an unconstrained optimization over \(b\) [source]. The overall offset \(c\) is computed from the \(b\)’s such that for large \(x\) the transformation approximately corresponds to the \(log_2\) function. This is done separately for each stratum, but with the same value across arrays. More precisely, if the element \(b[s,i]\) of the array \(b\) is the scaling parameter for the \(s\)-th stratum and the \(i\)-th array, then \(c[s]\) is computed as \(log2(2*f(mean(b[,i])))\). The offset \(c\) is inconsequential for all differential expression calculations, but many users like to see the data in a range that they are familiar with.

Summary
The VSN method brought the distributions closer together and we didn’t lose the original scale of the data. The method didn’t lose the differences between KO and WT cells at first glance. In addition, the 24th replicate of KO cell doesn’t stand out only in distribution of imputed data with kNN.

DISTRIBUTIONS

EigenMS

EigenMS is a normalization method developed for high-throughput mass spectrometry (MS) proteomics data. It uses eigenvector-based adjustments to remove unwanted variation, such as batch effects, from the data. The method works by identifying systematic biases in the dataset and applying a correction while preserving biologically relevant signals.

In the EigenMS method, eigentrends are calculated by decomposing the systematic variation in the proteomics data matrix using Singular Value Decomposition (SVD). This is typically expressed as:

\[X = U \Sigma V'\] Where:

  • \(X\) represents the original data matrix.
  • \(U\) and \(v'\) are orthogonal matrices.
  • \(\Sigma\) is a diagonal matrix of singular values.

The decomposition isolates systematic trends (eigentrends) as columns in \(U\), which can then be removed to adjust for unwanted variation.

Summary
The EigenMS method was the one which kept the differences between the replicates and cell types (KO and WT). The distribution are close together and we solve the problem of 24th replicate. In my opinion the EigenMS method gives the best results.

DISTRIBUTIONS

Statistics Metrics

CV

COEFFICIENT OF VARIATION (CV) / RELATIVE STANDARD DEVIATION (RSD)

This is a way to measure how spread out values are in a dataset relative to the mean. A lower RSD/CV indicates better normalization. It is calculated as:

\(CV = \frac{\sigma}{\mu}\)

where:

  • \(\sigma\): The standard deviation of dataset
  • \(\mu\): The mean of dataset

Summary For the biological data the cut-off level of CV is around 20 (+/-5). After close looking at the tables in the **Summary** section, we can safely say that the EigenMS method had the CV around 20 in all imputation methods. In fact, from this point of view we can distinguish four such methods that had good coefficient of variation.

  1. EigenMS
  2. MAD Scaling
  3. Min-Max Normalization
  4. Z-Score Normalization

When we take a closer look at the violin plots, we can see the strange pattern in the results for the kNN imputation method. Namely, many values have a CV close to the 0, which can mean that the standard deviation of the values is also close to the 0, which means that the values are very similar, which shouldn’t be the case.

The violin plots for the other methods look better and show the distribution/density of the CV correctly.

Non-Imputed

Mati Code

Random Forest

K-Nearest Neighbors

Ludovic

Summary

Non-Imputed

Imputed - Mati Code

Random Forest

K-Nearest Neighbors

Ludovic

ICC

After normalization, biological replicates should group more tightly. We can assess this by measuring the Intraclass Correlation Coefficient (ICC) to see if replicates cluster together.

A guidelines for interpretation by Koo and Li (2016):

  • below 0.50: poor â– 
  • between 0.50 and 0.75: moderate â– 
  • between 0.75 and 0.90: good â– 
  • above 0.90: excellent â– 

Summary We can clearly see that the replicates are the most tight after the normalization using the EigenMS method. Almost all methods group replicates more tightly, except the Min-Max and Median methods, where the ICCs were moderate or good.

Non-Imputed

Mati Code

Random Forest

K-Nearest Neighbors

Ludovic

t-test

In our project we used the paired t-test, which is a test based on the differences between the values of a single pair, i.e., one deducted from the other. The formula for the paired t-test is given by:

\[t = \frac{\sum{d}}{\sqrt{\frac{n(\sum{d^2})-(\sum{d})^2}{n-1}}}\]

Where:

  • \(d\) is a difference per paired value;
  • \(n\) is number of samples.

In our calculations, we tested the following hypothesis:

\(H_0\): There is no significant difference between the means of the two groups.
\(H_1\): There is a significant difference between the two population means.

Raw Data

Summary
The p-value plots show us that we had to normalize the data, because the output below doesn’t show strong differences between KO and WT cells.

Z-Score

Summary
The p-value plots look very bad, which means that we have lost whole differences between the samples.

Min-Max

Summary
Again the p-value plots look very bad, which means that we have again lost whole differences between the samples.

Median Scaling

Summary
Again the p-value plots look very bad, which means that we have again lost whole differences between the samples.

Mad Scaling

Summary
Again the p-value plots look very bad, which means that we have again lost whole differences between the samples.

Linear Regression

Summary
Again the p-value plots look very bad, which means that we have again lost whole differences between the samples.

VSN

Summary
Again the p-value plots look very bad, which means that we have again lost whole differences between the samples.

EigenMS

Summary
Finally, we have the expected p-value plots, which means that the EigenMS method again has the best results.

Fold Change

Raw Data

Non-Imputed

Mati Code

Random Forest

k-Nearest Neighbors

Ludovic

EigenMS

Non-Imputed

Mati Code

Random Forest

k-Nearest Neighbors

Ludovic

Conclusion

Summarizing everything above, we can safely say that the EigenMS method gives the best results. The distributions of the two normalization methods (VSN and EigenMS) were the best until the very end, but in the statistical metrics the EigenMS method won. It is worth noting that the correct shape of the p-value plot was only obtained for the data normalized with the EigenMS method.

About the imputation method.

  1. We can safely say that the Random Forest algorithm and the Ludovic method had the best performance.
  2. The kNN method corrects the shift in the distribution of the KO 24 replicates, but in the next calculations we discover a strange value in the imputed data. In fact, in some rows the values were the same, making it difficult to calculate the t-test and introducing an error in the CV calculations.
  3. The method that samples values from the distribution calculated on the raw data creates the additional peak of columns that doesn’t appear in the raw non-imputed data.

LS0tDQp0aXRsZTogIkNvbXBhcmlzb24iDQphdXRob3I6ICJLYWNwZXIgS2FzenViYSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogICAgaHRtbF9kb2N1bWVudDoNCiAgICAgICAgdG9jOiB0cnVlDQogICAgICAgIHRvY19mbG9hdDogDQogICAgICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmZvbnRzaXplOiAxNHB0DQpjc3M6IGRvY3VtZW50X3N0eWxlLmNzcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLmtlZXAgPSAiYWxsIiwgZWNobz1GQUxTRSkNCg0KaWYgKCFyZXF1aXJlKCJyYW5kb21Gb3Jlc3QiLCBxdWlldGx5ID0gVFJVRSkpDQogICAgaW5zdGFsbC5wYWNrYWdlcygicmFuZG9tRm9yZXN0IikNCmlmICghcmVxdWlyZSgiY2FyZXQiLCBxdWlldGx5ID0gVFJVRSkpDQogICAgaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKQ0KaWYgKCFyZXF1aXJlKCdwY2FNZXRob2RzJywgcXVpZXRseSA9IFRSVUUpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoJ3BjYU1ldGhvZHMnKQ0KaWYgKCFyZXF1aXJlKCdEVCcsIHF1aWV0bHkgPSBUUlVFKSkNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCdEVCcpDQppZiAoIXJlcXVpcmUoJ2dncHVicicsIHF1aWV0bHkgPSBUUlVFKSkNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCdnZ3B1YnInKQ0KaWYgKCFyZXF1aXJlKCdnZ3Bsb3QyJywgcXVpZXRseSA9IFRSVUUpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoJ2dncGxvdDInKQ0KaWYgKCFyZXF1aXJlKCdkcGx5cicsIHF1aWV0bHkgPSBUUlVFKSkNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCdkcGx5cicpDQppZiAoIXJlcXVpcmUoJ3RpZHlyJywgcXVpZXRseSA9IFRSVUUpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoJ3RpZHlyJykNCmlmICghcmVxdWlyZSgndnNuJywgcXVpZXRseSA9IFRSVUUpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoJ3ZzbicpDQoNCnNob3dfY3ZfdGFibGUgPC0gZnVuY3Rpb24oZGYpIHsNCiAgICBEVDo6ZGF0YXRhYmxlKGRmLCByb3duYW1lcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgb3B0aW9ucz1saXN0KHNlYXJjaGluZz1GQUxTRSwgcGFnaW5nPUZBTFNFLCBpbmZvPUZBTFNFKSkgfD4NCiAgICBEVDo6Zm9ybWF0U3R5bGUoY29sdW1ucyA9IGMoJ21lYW5fS08nLCAnbWVhbl9XVCcsICdtZWRpYW5fS08nLCAnbWVkaWFuX1dUJyksIA0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gRFQ6OnN0eWxlSW50ZXJ2YWwoYygwLCAyNSksIGMoJ3doaXRlJywnbGlnaHRncmVlbicsICd3aGl0ZScpKSkgfD4NCiAgICBEVDo6Zm9ybWF0U3R5bGUoY29sdW1ucyA9ICdtZXRob2QnLCBmb250V2VpZ2h0ID0gJ2JvbGQnKQ0KfQ0KDQphc3NpZ25fbWlzc2luZyA8LSBmdW5jdGlvbihwcm90ZWluLmlkcywgY29uZGl0aW9uLCBsZnFfaW50ZW5zaXR5KSB7DQogICAgIyB2ZXJpZmljYXRpb24gb2YgdGhlIGZ4biBhc3N1bXB0aW9ucw0KICAgIGlmICghaXMuZmFjdG9yKGNvbmRpdGlvbikpIHtybGFuZzo6YWJvcnQoJ1RoZSBjb25kaXRpb24gYXJlIG5vdCBmYWN0b3IhJyl9DQoNCiAgICAjIG9jY3VyZW5jZXMgb2YgcHJvdGVpbiBJRHMgcGVyIGNvbmRpdGlvbg0KICAgIG9jY3VyIDwtIGRwbHlyOjp0aWJibGUocHJvdGVpbi5pZHMpIHw+DQogICAgICAgIGRwbHlyOjpncm91cF9ieShwcm90ZWluLmlkcykgfD4NCiAgICAgICAgZHBseXI6OnN1bW1hcmlzZShsZW4gPSBsZW5ndGgocHJvdGVpbi5pZHMpKSB8Pg0KICAgICAgICBkcGx5cjo6ZGlzdGluY3QobGVuKQ0KDQogICAgIyBvY2N1cmVuY2VzIG9mIGNvbmRpdGlvbg0KICAgIG9jY3VyX3Blcl9jb25kIDwtIGRwbHlyOjp0aWJibGUocHJvdGVpbi5pZHMsIGNvbmRpdGlvbikgfD4NCiAgICAgICAgZHBseXI6Omdyb3VwX2J5KHByb3RlaW4uaWRzLCBjb25kaXRpb24pIHw+DQogICAgICAgIGRwbHlyOjpzdW1tYXJpc2UobGVuID0gbGVuZ3RoKHByb3RlaW4uaWRzKSkNCiAgICBvY2N1cl9wZXJfY29uZCA8LSB1bmlxdWUob2NjdXJfcGVyX2NvbmQkbGVuKQ0KDQogICAgaWYgKGxlbmd0aChwcm90ZWluLmlkcykvb2NjdXIgIT0gbGVuZ3RoKHVuaXF1ZShwcm90ZWluLmlkcykpKSB7cmxhbmc6OmFib3J0KCdUaGUgcHJvdGVpbiBJRHMgYXJlIG5vdCB1bmlxdWUhJyl9DQogICAgaWYgKCFpcy5udW1lcmljKGxmcV9pbnRlbnNpdHkpKSB7cmxhbmc6OmFib3J0KCdUaGUgbGZxIGludGVuc2l0aWVzIGFyZSBub3QgbnVtZXJpYyEnKX0NCg0KICAgIGRmIDwtIGRhdGEuZnJhbWUoJ3Byb3QuSURzJz1wcm90ZWluLmlkcywgJ2NvbmRpdGlvbic9Y29uZGl0aW9uLCAnbGZxJz1sZnFfaW50ZW5zaXR5KQ0KDQogICAgIyBDYWxjdWxhdGluZyBudW1iZXIgb2YgbWlzc2luZyB2YWx1ZXMgZm9yIGVhY2ggcHJvdGVpbg0KICAgIG51bWJlcl9taXNzaW5nIDwtIGRmIHw+DQogICAgICAgIGRwbHlyOjpncm91cF9ieShwcm90LklEcykgfD4NCiAgICAgICAgZHBseXI6OnN1bW1hcmlzZShub19OQXMgPSBzdW0oaXMubmEobGZxKSkpDQoNCiAgICBtaXNzaW5nbmVzcyA8LSBwdXJycjo6bWFwKG51bWJlcl9taXNzaW5nJG5vX05BcywgZnVuY3Rpb24obm8pIHsNCiAgICAgICAgICAgIGlmIChubyA9PSBvY2N1cikgew0KICAgICAgICAgICAgICByZXAoJ2FsbF9OQScsIG9jY3VyKQ0KICAgICAgICAgICAgfSBlbHNlIGlmIChubyA9PSBvY2N1ci0xKSB7DQogICAgICAgICAgICAgIHJlcCgnTU5BUicsIG9jY3VyKQ0KICAgICAgICAgICAgfSBlbHNlIGlmIChubyA8IG9jY3VyLTEgJiBubyAhPSAwKSB7DQogICAgICAgICAgICAgIHJlcCgnTUFSJywgb2NjdXIpDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICByZXAoJ2NvbXBsZXRlJywgb2NjdXIpDQogICAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgbWlzc2luZ25lc3MgPC0gZGF0YS5mcmFtZShkby5jYWxsKGMsbWlzc2luZ25lc3MpKQ0KDQogICAgcHJvdC5pZC5taXNzIDwtIHB1cnJyOjptYXAodW5pcXVlKG51bWJlcl9taXNzaW5nJHByb3QuSURzKSwgZnVuY3Rpb24oaWQpIHJlcChpZCwgb2NjdXIpKQ0KICAgIHByb3QuaWQubWlzcyA8LSBkYXRhLmZyYW1lKGRvLmNhbGwoYyxwcm90LmlkLm1pc3MpKQ0KDQogICAgZGZfbWlzcyA8LSBkYXRhLmZyYW1lKHByb3QuaWQubWlzcywgbWlzc2luZ25lc3MpDQogICAgY29sbmFtZXMoZGZfbWlzcykgPC0gYygncHJvdC5JRHMnLCAnbWlzc2luZ25lc3MnKQ0KDQoNCiAgICBtaXNzaW5nbmVzcyA8LSBsYXBwbHkodW5pcXVlKHByb3RlaW4uaWRzKSwgZnVuY3Rpb24oaWQpIGRmX21pc3Nbd2hpY2goZGZfbWlzcyRwcm90LklEcyA9PSBpZCksJ21pc3NpbmduZXNzJ10pDQogICAgZGYkbWlzc2luZ25lc3MgPC0gZG8uY2FsbChjLG1pc3NpbmduZXNzKQ0KDQogICAgcmV0X2xpc3QgPC0gbGlzdChkZiA9IGRmLCBtaXNzaW5nbmVzcz1kZiRtaXNzaW5nbmVzcykNCn0NCg0KdHRlc3QgPC0gZnVuY3Rpb24oZGYsIGdycDEsIGdycDIpeyANCiAgeCA9IGRmW2dycDFdDQogIHkgPSBkZltncnAyXQ0KICB4ID0gYXMubnVtZXJpYygoeCkpDQogIHkgPSBhcy5udW1lcmljKCh5KSkNCiAgcmVzdWx0cyA9IHQudGVzdCh4LHksIA0KICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gJ3R3by5zaWRlZCcsICNvbmUtc2lkZWQ6ICdncmVhdGVyJyBpcyB4ID4geQ0KICAgICAgICAgICAgICAgICAgIHBhaXJlZCA9IFQsDQogICAgICAgICAgICAgICAgICAgbmEuYWN0aW9uPW5hLm9taXQpDQogIHJlc3VsdHMkcC52YWx1ZQ0KfQ0KDQpwLmN1dG9mZiA9IDAuMDUgI3NldCBwIHZhbHVlIGN1dG9mZg0KRkMuY3V0b2ZmID0gMSAjIHNldCBmb2xkIGNoYW5nZSBjdXRvZmYNCg0KcGxvdGhpc3QgPC0gZnVuY3Rpb24oZGYsIHRpdGxlPScnLCBwbG90LnRpdGxlLmFuZC5sZWdlbmQ9VFJVRSkgew0KICAgIGlmICghaXMuZGF0YS5mcmFtZShkZikpIHsgZGYgPC0gYXMuZGF0YS5mcmFtZShkZil9DQogICAgDQogICAgIyBBc3N1bWluZyBMRlFfS08gaXMgb3VyIGRhdGEgZnJhbWUgd2l0aCBhdCBsZWFzdCAzIGNvbHVtbnMNCiAgICAjIFJlc2hhcGUgdGhlIGRhdGEgdG8gYSBsb25nIGZvcm1hdA0KICAgIGRmIDwtIGRmIHw+DQogICAgICAgIHBpdm90X2xvbmdlcihjb2xzID0gMTpuY29sKGRmKSwgbmFtZXNfdG8gPSAiUmVwIiwgdmFsdWVzX3RvID0gIkxGUVZhbHVlIikNCiAgICANCiAgICAjIFBsb3QgYWxsIGhpc3RvZ3JhbXMgb24gdGhlIHNhbWUgcGxvdCB1c2luZyBnZ3Bsb3QNCiAgICBpZiAocGxvdC50aXRsZS5hbmQubGVnZW5kKSB7DQogICAgICAgIHJldF9wbG90IDwtIGdncGxvdChkZiwgYWVzKHggPSBMRlFWYWx1ZSwgZmlsbCA9IFJlcCkpICsNCiAgICAgICAgICAgIGdlb21faGlzdG9ncmFtKGFscGhhID0gMC40LCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGJpbnMgPSAzMCkgKw0KICAgICAgICAgICAgbGFicyh0aXRsZSA9IHBhc3RlKHRpdGxlKSwgeCA9ICJWYWx1ZXMiLCB5ID0gIkZyZXF1ZW5jeSIpICsNCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXRfcGxvdCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gTEZRVmFsdWUsIGZpbGwgPSBSZXApKSArDQogICAgICAgICAgICBnZW9tX2hpc3RvZ3JhbShhbHBoYSA9IDAuNCwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBiaW5zID0gMzApICsNCiAgICAgICAgICAgIGxhYnMoeCA9ICJWYWx1ZXMiLCB5ID0gIkZyZXF1ZW5jeSIpICsNCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKQ0KICAgIH0NCiAgICByZXR1cm4ocmV0X3Bsb3QpDQp9DQoNCnBsb3RvbmV2aW9saW4gPC0gZnVuY3Rpb24ob2JqZWN0LCB0aXRsZT0nJykgew0KICAgIG9iamVjdCA8LSBhcy5kYXRhLmZyYW1lKG9iamVjdCkgfD4NCiAgICAgICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAnU2FtcGxlJywgdmFsdWVzX3RvID0gJ0xGUV9DVicpDQogICAgDQogICAgZ2dwbG90KGRhdGE9b2JqZWN0LCBhZXMoeD1TYW1wbGUsIHk9TEZRX0NWLCBmaWxsPVNhbXBsZSkpKw0KICAgICAgICBnZW9tX2JveHBsb3Qod2lkdGg9MC4yKSsNCiAgICAgICAgZ2VvbV92aW9saW4oYWxwaGE9MC40KSsNCiAgICAgICAgbGFicyh0aXRsZT10aXRsZSx4PU5VTEwseT0nTEZRIENWWyVdJykrDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJywNCiAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSd3aGl0ZScsIGNvbG91ciA9ICdncmV5JyksDQogICAgICAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ2dyZXknKSkNCn0NCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkodnNuKQ0KbGlicmFyeShwcm90dGkpDQpzb3VyY2UoJ0VpZ2VuTVMvRWlnZW5NUy9FaWdlbk1TLlInKQ0KDQp3cml0ZUxpbmVzKCd0YWJsZSB7DQogIHdpZHRoOiAxMDAlOw0KICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KfQ0KdGgsIHRkIHsNCiAgd2lkdGg6IDE0LjI4JTsgLyogRGlzdHJpYnV0ZSB3aWR0aCBlcXVhbGx5ICgxMDAlIC8gNyBjb2x1bW5zKSAqLw0KICBib3JkZXI6IDFweCAjZjJmMmYyOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7IC8qIENlbnRlciB0aGUgdGV4dCAqLw0KICBwYWRkaW5nOiA4cHg7DQp9DQp0aCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7DQogIGJvcmRlcjogMHB4Ow0KfQ0KYm9keSB7DQogICAgdGV4dC1hbGlnbjoganVzdGlmeQ0KfScsIGNvbiA9ICdkb2N1bWVudF9zdHlsZS5jc3MnKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNClRoZSByZXN1bHRzIGJlbG93IHNob3dzIHRoZSBjb21wYXJpc29uIG9mIHNldmVyYWwgbm9ybWFsaXphdGlvbiBhbmQgaW1wdXRhdGlvbiBtZXRob2RzLg0KV2UgZGVjaWRlZCB0byB1c2UgNCBpbXB1dGF0aW9uIG1ldGhvZHM6DQoNCjEuIFNoaWZ0ZWQgRGlzdHJpYnV0aW9uIGJhc2VkIG9uIHRoZSBkYXRhOw0KMi4gSW1wdXRhdGlvbiB1c2luZyB0aGUgUmFuZG9tIEZvcmVzdCBhbGdvcml0aG07DQozLiBJbXB1dGF0aW9uIHVzaW5nIHRoZSBrLU5lYXJlc3QgTmVpZ2hib3JzIGFsZ29yaXRobTsNCjQuIEltcHV0YXRpb24gdXNpbmcgdGhlIGx1ZG92aWMgbWV0aG9kLg0KDQphbmQgOCBub3JtYWxpemF0aW9uIG1ldGhvZHM6DQoNCjEuIFotU2NvcmUgTm9ybWFsaXphdGlvbg0KMi4gTWluLU1heCBOb3JtYWxpemF0aW9uDQozLiBNZWRpYW4gU2NhbGluZw0KNC4gTUFEIChNZWRpYW4gQWJzb2x1dGUgRGV2aWF0aW9uKSBTY2FsaW5nDQo1LiBMaW5lYXIgUmVncmVzc2lvbiBOb3JtYWxpemF0aW9uDQo2LiBWU04gKFZhcmlhbmNlIFN0YWJpbGl6YXRpb24gTm9ybWFsaXphdGlvbikNCjcuIEVpZ2VuTVMNCg0KV2Ugc2VsZWN0ZWQgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyB0byB0cmFpbiB0aGUgbWFjaGluZSBsZWFybmluZyBtb2RlbHM6DQoNCiogKipTZXF1ZW5jZSBjb3ZlcmFnZSoqIC0gcGVyY2VudGFnZSBvZiB0aGUgc2VxdWVuY2UgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoZSBpZGVudGlmaWVkDQpwZXB0aWRlcyBvZiB0aGUgZmlyc3QgcHJvdGVpbiBzZXF1ZW5jZSBjb250YWluZWQgaW4gdGhlIGdyb3VwOw0KKiAqKlNlcXVlbmNlIGxlbmd0aCoqIC0gdGhlIGxlbmd0aCBvZiB0aGUgbGVhZGluZyBwcm90ZWluIHNlcXVlbmNlIGNvbnRhaW5lZCBpbiB0aGUgZ3JvdXA7DQoqICoqTW9sIHdlaWd0aCBrRGEqKiAtIG1vbGVjdWxhciB3ZWlnaHQgb2YgdGhlIGxlYWRpbmcgcHJvdGVpbiBzZXF1ZW5jZSBjb250YWluZWQgDQppbiB0aGUgcHJvdGVpbiBncm91cDsNCiogKipRdmFsdWUqKiAtIHRoZSByYXRpbyBvZiByZXZlcnNlIHRvIGZvcndhcmQgcHJvdGVpbiBncm91cHM7DQoqICoqU2NvcmUqKiAtIFByb3RlaW4gc2NvcmUgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIHBlcHRpZGUgcG9zdGVyaW9yIGVycm9yIHByb2JhYmlsaXRpZXMNCiogKipNUy9NUyBDb3VudCoqIC0gdGhlIG51bWJlciBvZiB0YW5kZW0gTVMgc2NhbnMgdGhhdCB3ZXJlIG1hZGUgYmFzZWQgb24gdGhpcyBmdWxsIA0Kc2NhbiAoZS5nLiBhIHRvcCAxMCBtZXRob2Qgc2VsZWN0cyB0aGUgdG9wIDEwIG1vc3QgaW50ZW5zZSBpb25zIGluIHRoZSBzY2FuIGFuZCANCmZyYWdtZW50cyB0aG9zZSkuDQoqIExGUSB2YWx1ZXMgZm9yIFRPVEFMUyAoS08gMjIvMjMvMjQgYW5kIFdUIDIyLzIzLzI0KSAtIHRhcmdldA0KKiBCYXNlZCBvbiB0aGUgY29sdW1uIG5hbWVzIG9mIHRqZSBMRlEgdmFsdWVzLCB3ZSBjcmVhdGVkIDIgbW9yZSBmZWF0dXJlczogDQogICAgMS4gKipjZWxsdHlwZSoqIC0gS25vY2tvdXQgKEtPKSBvciBXaWxkIFR5cGUgKFdUKSAtIGZvciBrTk4gZW5jb2RlZCBhcyAoMTpLTywgMjpXVCkNCiAgICAyLiAqKnJlcCoqIC0gcmVwbGljYXRlcyAoMjIsIDIzIG9yIDI0KSAtIGZvciBrTk4gZW5jb2RlZCBhcyAoMToyMiwgMjoyMywgMzoyNCkNCg0KV2UgdXNlZCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBLLU5lYXJlc3QgTmVpZ2hib3JzIGFsZ29yaXRobSAoYm9sZCByb3cpOg0KDQp8IGsgfCBSTVNFIHwgUnNxdWFyZWQgfCBNQUUgfA0KfDotLTp8Oi0tOnw6LS06fDotLTp8DQp8ICoqNSoqIHwgKio1NjAxNDE0MTEqKiB8ICoqMC41NzY0OTAzKiogfCAqKjgzNDk5ODc4KiogfA0KfCA3IHwgNTg2MTQxNTcyIHwgMC41MTEwMTQ4IHwgODkzNDUxODcgfA0KfCA5IHwgNjE1NjQ5MDIxIHwgMC40NTQ5MzEzIHwgOTM5NzYwNDggfA0KDQpGb3IgdGhlIFJhbmRvbSBGb3Jlc3QgYWxnb3JpdGhtIHdlIHVzZWQgdGhlIEdyaWQgU2VhcmNoIG1ldGhvZCB0byBmaW5kIHRoZSBiZXN0IGh5cGVycGFyYW1ldGVycy4NClRoZSB0YWJsZSBiZWxvd3Mgc2hvd3MgdGhlIG91dHB1dCBvZiB0aGUgdG9wIDEwIG1vZGVscy4NCg0KPGNlbnRlcj48YiBzdHlsZT0nZm9udC1zaXplOjIwcHgnPkdSSUQgU0VBUkNIIEZPUiBSQU5ET00gRk9SRVNUIE1PREVMPC9iPjwvY2VudGVyPg0KPGJyPg0KDQp8ICAgICB8IG51bS50cmVlcyB8IG10cnkgfCBtaW4ubm9kZS5zaXplIHwgcmVwbGFjZSB8IHNhbXBsZS5mcmFjdGlvbiB8ICAgICAgICBybXNlICAgICAgICAgfCBwZXJjX2dhaW4gfA0KfDotLS06fDotLS0tLS0tLS06fDotLS0tOnw6LS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tOnwNCnwqKjEqKnwgICoqMTAwKiogIHwgKio0Kip8ICAgICAgICAgKio1KiogfCoqZmFsc2UqKnwgICAgICAgICAqKjAuOCoqIHwgICoqMzYxODQzMjEuNjQ2NioqICB8ICoqMi44NjMxKip8DQp8ICAyICB8ICAgICAgIDUwMCB8ICAgIDQgfCAgICAgICAgICAgICA1IHwgZmFsc2UgICB8ICAgICAgICAgICAgMC44ICB8ICAgIDM2NzAzMjk2OC44NzU3ICAgfCAgICAgMS40NzEzfA0KfCAgMyAgfCAgICAgICAzMDAgfCAgICA0IHwgICAgICAgICAgICAgNSB8IGZhbHNlICAgfCAgICAgICAgICAgIDAuOCAgfCAgICAzNjc5NjM5MDAuMzAyODQgIHwgICAgIDEuMjIxNHwNCnwgIDQgIHwgICAgICAgNTAwIHwgICAgNCB8ICAgICAgICAgICAgIDEgfCB0cnVlICAgIHwgICAgICAgICAgICAwLjggIHwgICAgMzcwMDg0MTEwLjE1MjQgICB8ICAgICAwLjY1MjN8DQp8ICA1ICB8ICAgICAgIDUwMCB8ICAgIDQgfCAgICAgICAgICAgIDEwIHwgZmFsc2UgICB8ICAgICAgICAgICAgMC44ICB8ICAgIDM3MDM4MDU4MS4yNjE5ICAgfCAgICAgMC41NzI3fA0KfCAgNiAgfCAgICAgICAzMDAgfCAgICA0IHwgICAgICAgICAgICAgMSB8IHRydWUgICAgfCAgICAgICAgICAgMC42MyAgfCAgICAzNzE0NDY2NjQuOTU2MiAgIHwgICAgIDAuMjg2NXwNCnwgIDcgIHwgICAgICAgMTAwIHwgICAgNCB8ICAgICAgICAgICAgIDUgfCBmYWxzZSAgIHwgICAgICAgICAgICAwLjggIHwgICAgMzcyMTMxMTQ4Ljk5NDcgICB8ICAgICAwLjEwMjd8DQp8ICA4ICB8ICAgICAgIDMwMCB8ICAgIDQgfCAgICAgICAgICAgIDEwIHwgZmFsc2UgICB8ICAgICAgICAgICAgMC44ICB8ICAgIDM3MjE2OTk5OS4zMTk4ICAgfCAgICAgMC4wOTIzfA0KfCAgOSAgfCAgICAgICAzMDAgfCAgICA0IHwgICAgICAgICAgICAgNCB8IHRydWUgICAgfCAgICAgICAgICAgMC42MyAgfCAgICAzNzI3Njc2NzAuODEzOSAgIHwgICAgLTAuMDY4MXwNCnwgMTAgIHwgICAgICAgMzAwIHwgICAgNCB8ICAgICAgICAgICAgIDMgfCB0cnVlICAgIHwgICAgICAgICAgICAwLjggIHwgICAgMzczNTg2MTE2LjU4MjggICB8ICAgIC0wLjI4Nzh8DQoNCg0KQmFzZSBvbiB0aGUgb3V0cHV0IG9mIHRoZSBncmlkIHNlYXJjaCwgd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGlzIGJldHRlciBtb2RlbCB0aGFuIGRlZmF1bHQgYW5kIA0KaXQgaXMgcmFuZG9tIGZvcmVzdCBtb2RlbCB3aXRoIHRoZSBmb2xsb3dpbmcgaHlwZXJwYXJhbWV0ZXJzOg0KDQoqIG51bS50cmVlcyA9IDEwMA0KKiBtdHJ5ID0gNA0KKiBtaW4ubm9kZS5zaXplID0gNQ0KKiByZXBsYWNlID0gRkFMU0UNCiogc2FtcGxlLmZyYWN0aW9uID0gMC44MA0KDQpXZSB0cmFpbiBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbCB3aGljaCwgYWZ0ZXIgdGhlIHN0ZXB3aXNlIHNlbGVjdGlvbiwgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToNCg0KJCRMRlF2YWx1ZSA9IDg2MzE4MTUgXGNkb3Qgbm8ucHJvdGVpbnMgLTE4MTcyNzczIFxjZG90IHBlcHRpZGVzICsgMTc5NDIzNyBcY2RvdA0Kc2VxLmNvdmVyYWdlICtcXCArIDgwNzkzMyBcY2RvdCBtb2wud2VpZ2h0LmtEYSArIDQzMDE0MyBcY2RvdCBzY29yZSArIDE0OTAxNzUgXGNkb3QgbXMuY291bnQkJA0KDQpXaGVyZToNCg0KKiBgbm8ucHJvdGVpbnNgIC0gTnVtYmVyIG9mIHByb3RlaW5zIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGdyb3VwLg0KKiBgcGVwdGlkZXNgIC0gVGhlIHRvdGFsIG51bWJlciBvZiBwZXB0aWRlIHNlcXVlbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3RlaW4gDQpncm91cCAoaS5lLiBmb3IgYWxsIHRoZSBwcm90ZWlucyBpbiB0aGUgZ3JvdXApLg0KKiBgc2VxLmNvdmVyYWdlYCAtIFBlcmNlbnRhZ2Ugb2YgdGhlIHNlcXVlbmNlIHRoYXQgaXMgY292ZXJlZCBieSB0aGUgaWRlbnRpZmllZA0KcGVwdGlkZXMgb2YgdGhlIGZpcnN0IHByb3RlaW4gc2VxdWVuY2UgY29udGFpbmVkIGluIHRoZSBncm91cC4NCiogYG1vbC53aWVnaHQua0RhYCAtIE1vbGVjdWxhciB3ZWlnaHQgb2YgdGhlIGxlYWRpbmcgcHJvdGVpbiBzZXF1ZW5jZSBjb250YWluZWQgDQppbiB0aGUgcHJvdGVpbiBncm91cC4NCiogYHNjb3JlYCAtIEFuZHJvbWVkYSBzY29yZSBmb3IgdGhlIGJlc3QgYXNzb2NpYXRlZCBNUy9NUyBzcGVjdHJ1bS4NCiogYG1zLmNvdW50YCAtIFRoZSBudW1iZXIgb2YgTVMvTVMgc3BlY3RyYSByZWNvcmRlZCBpbiB0aGlzIHJhdyBmaWxlLg0KDQpXZSB0cmFpbiBhbmQgY29tcGFyZSA0IG1hY2hpbmUgbGVhcm5pbmcgbW9kZWxzIGFuZCBiYXNlZCBvbiB0aGUgcGVyZm9ybWFuY2UgKHRhYmxlIA0KYmVsb3cpLCB3ZSBkZWNpZGVkIHRvIHVzZSAyIG9mIHRoZW06DQoNCjEuIFJhbmRvbSBGb3Jlc3QNCjIuIGtOTg0KDQp8ICAgICBNb2RlbCAgICAgfCBOUk1TRSB8ICBNU0UgIHwgUk1TRSAgfCAgTUFFICB8ICAgUjIgICB8DQp8Oi0tLS0tLS0tLS0tLS06fDotLS0tLTp8Oi0tLS0tOnw6LS0tLS06fDotLS0tLTp8Oi0tLS0tLTp8DQp8ICoqUkYqKiAgICAgICAgfCAwLjU3MjQgfCAwLjgwNDQgfCAwLjg5NjkgfCAwLjY2NjMgfCAwLjc2MTUgfA0KfCAqKmtOTioqICAgICAgIHwgMC42MDcwIHwgMS4wMTgyIHwgMS4wMDkxIHwgMC43NTkwIHwgMC42NzAxIHwNCnwgKipMTSoqICAgICAgICB8IDAuODczNyB8IDMuODgyNSB8IDEuOTcwNCB8IDEuNjA5MSB8IDAuMjYyMyB8DQp8ICoqUENBKiogICAgICAgfCAxICAgICAgfCA2Ljg4NjMgfCAyLjYyNDIgfCAyLjIzODAgfCAwICAgICAgfA0KDQoNCkZvciB0aGUgTHVkb3ZpYyBtZXRob2QgZmlyc3Qgd2UgaGFkIHRvIGFzc2lnbiB0aGUgbWlzc2luZyB2YWx1ZXMgdXNpbmcgdGhlDQpbYHByb3R0aTo6YXNzaWduX21pc3NpbmduZXNzKClgXShodHRwczovL2pwcXVhc3QuZ2l0aHViLmlvL3Byb3R0aS9yZWZlcmVuY2UvYXNzaWduX21pc3NpbmduZXNzLmh0bWwpIA0KZnhuLCB3aGljaCBhZGRlZCB0aGUgKipgY29tcGFyaXNvbmAqKiBjb2x1bW4gY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiBuYW1lIGZvciB0aGUgc3BlY2lmaWMgDQp0cmVhdG1lbnQvcmVmZXJlbmNlIHBhaXIgYW5kIHRoZSAqKmBtaXNzaW5nbmVzc2AqKiBjb2x1bW4gd2l0aCA0IHR5cGVzIG9mIG1pc3NpbmduZXNzOg0KDQoqICoqYCJjb21wbGV0ZSJgKio6IE5vIG1pc3NpbmcgdmFsdWVzIGZvciBldmVyeSByZXBsaWNhdGUgb2YgdGhpcyByZWZlcmVuY2UvdHJlYXRtZW50IA0KcGFpciBmb3IgdGhlIHNwZWNpZmljIGdyb3VwaW5nIHZhcmlhYmxlLg0KKiAqKmAiTU5BUiJgKio6IE1pc3Npbmcgbm90IGF0IHJhbmRvbS4gQWxsIHJlcGxpY2F0ZXMgb2YgZWl0aGVyIHRoZSByZWZlcmVuY2Ugb3IgDQp0cmVhdG1lbnQgY29uZGl0aW9uIGhhdmUgbWlzc2luZyB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpYyBncm91cGluZyB2YXJpYWJsZS4NCiogKipgIk1BUiJgKio6IE1pc3NpbmcgYXQgcmFuZG9tLiBBdCBsZWFzdCBuLTEgcmVwbGljYXRlcyBoYXZlIG1pc3NpbmcgdmFsdWVzIGZvciB0aGUgDQpyZWZlcmVuY2UvdHJlYXRtZW50IHBhaXIgZm9yIHRoZSBzcGVjaWZpYyBncm91cGluZyB2YXJpYWJsZS4NCiogKipgTkFgKio6IFRoZSBjb21wYXJpc29uIGlzIG5vdCBjb21wbGV0ZSBlbm91Z2ggdG8gZmFsbCBpbnRvIGFueSBvdGhlciBjYXRlZ29yeS4gDQpJdCB3aWxsIG5vdCBiZSBpbXB1dGVkIGlmIGltcHV0YXRpb24gaXMgcGVyZm9ybWVkLg0KDQpUaGVuIHdpdGggYWRkaXRpb25hbCBjb2x1bW4gd2UgY291bGQgZW50ZXIgb3VyIGRhdGEgaW50byANCltgcHJvdHRpOjppbXB1dGUoKWBdKGh0dHBzOi8vanBxdWFzdC5naXRodWIuaW8vcHJvdHRpL3JlZmVyZW5jZS9pbXB1dGUuaHRtbCkgDQpmeG4sIHdoaWNoIHBlcmZvcm1zIHRoZSBMdWRvdmljIGltcHV0YXRpb24gbWV0aG9kIGJhc2VkIG9uIHRoZSAqKmBtaXNzaW5nbmVzc2AqKiBjb2x1bW4NCnVzaW5nIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zOg0KDQoqICoqYCJNTkFSImAqKiBtaXNzaW5nbmVzcyBpcyBzYW1wbGVkIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uIGFyb3VuZCBhIHZhbHVlIHRoYXQgDQppcyB0aHJlZSBsb3dlciAobG9nMikgdGhhbiB0aGUgbG93ZXN0IGludGVuc2l0eSB2YWx1ZSByZWNvcmRlZCBmb3IgdGhlIA0KcHJlY3Vyc29yL3BlcHRpZGUgYW5kIHRoYXQgaGFzIGEgc3ByZWFkIG9mIHRoZSBtZWFuIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgdGhlIHByZWN1cnNvci9wZXB0aWRlLg0KKiAqKmAiTUFSImAqKiBkYXRhIGlzIGltcHV0ZWQgdXNpbmcgdGhlIG1lYW4gYW5kIHZhcmlhbmNlIG9mIHRoZSBjb25kaXRpb24gd2l0aCB0aGUgbWlzc2luZyBkYXRhLg0KKiAqKmBOQWAqKiBkYXRhIGlzIG5vdCBpbXB1dGVkLg0KDQpgYGB7ciBsb2FkIGRhdGF9DQojIGxvYWQgcmF3IGRhdGENCnByb3RlaW4uZ3JvdXBzIDwtIHJlYWRyOjpyZWFkX3RzdignLi9kYXRhL3Byb3RlaW5Hcm91cHMudHh0JyxzaG93X2NvbF90eXBlcyA9IEZBTFNFKQ0KDQpwcm90ZWluLmdyb3VwcyA8LSBwcm90ZWluLmdyb3VwcyB8PiBmaWx0ZXIoaXMubmEoYE9ubHkgaWRlbnRpZmllZCBieSBzaXRlYCksDQogICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoUmV2ZXJzZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoYFBvdGVudGlhbCBjb250YW1pbmFudGApKQ0KDQojIG5vbi1pbXB1dGVkIGRhdGENCmxmcSA8LSByZWFkLmNzdignLi9kYXRhL25vbmltcHV0ZWRfbGZxLmNzdicpDQoNCiMgaW1wdXRlZCBkYXRhIHdpdGggTWF0ZXVzeiBmeG4NCmxmcV9pbXAgPC0gcmVhZC5jc3YoJy4vZGF0YS9MRlFfcmF3X3RvdGFsc19pbXAuY3N2JykNCmNvbG5hbWVzKGxmcV9pbXApIDwtIGdzdWIoJ19UT1RBTFNfJywgJy5JLicsIGNvbG5hbWVzKGxmcV9pbXApKQ0KYGBgDQoNCmBgYHtyIG5vbmltcCBUT1RBTFMgZGF0YX0NCiMgRXh0cmFjdGluZyBvbmx5IFRPVEFMUyBkYXRhIGZvciBrbm9ja291dA0KTEZRX0tPIDwtIGxmcSB8PiBzZWxlY3QoY29udGFpbnMoJ0tPJykpDQoNCiMgRXh0cmFjdGluZyBvbmx5IFRPVEFMUyBkYXRhIGZvciB3aWxkIHR5cGUNCkxGUV9XVCA8LSBsZnEgfD4gc2VsZWN0KGNvbnRhaW5zKCdXVCcpKQ0KYGBgDQoNCmBgYHtyIGltcCBUT1RBTFMgZGF0YX0NCiMgRXh0cmFjdGluZyBvbmx5IFRPVEFMUyBkYXRhIGZvciBrbm9ja291dA0KTEZRX0tPX2ltcCA8LSBsZnFfaW1wIHw+IHNlbGVjdChjb250YWlucygnS08nKSkNCg0KIyBFeHRyYWN0aW5nIG9ubHkgVE9UQUxTIGRhdGEgZm9yIHdpbGQgdHlwZQ0KTEZRX1dUX2ltcCA8LSBsZnFfaW1wIHw+IHNlbGVjdChjb250YWlucygnV1QnKSkNCmBgYA0KDQpgYGB7ciBkYXRhIHRvIFJGIGFuZCBrTk59DQojIGV4dHJhY3RpbmcgY29sdW1ucyB0byBtYWNoaW5lIGxlYXJuaW5nIG1vZGVscw0KZGZfbWwgPC0gcHJvdGVpbi5ncm91cHMgfD4NCiAgICBkcGx5cjo6c2VsZWN0KGBOdW1iZXIgb2YgcHJvdGVpbnNgLCBQZXB0aWRlcywgYFNlcXVlbmNlIGNvdmVyYWdlIFslXWAsIGBTZXF1ZW5jZSBsZW5ndGhgLCANCiAgICAgICAgICAgICAgICAgIGBNb2wuIHdlaWdodCBba0RhXWAsIGBRLXZhbHVlYCwgU2NvcmUsIGBNUy9NUyBjb3VudGAsIA0KICAgICAgICAgICAgICAgICAgZHBseXI6OnN0YXJ0c193aXRoKCdMRlEgSW50ZW5zaXR5JykgJiAoZW5kc193aXRoKCcyMicpIHwgZW5kc193aXRoKCcyMycpIHwgZW5kc193aXRoKCcyNCcpKSAmIGRwbHlyOjpjb250YWlucygnVE9UQUxTJykpDQoNCiMgY2hhbmdpbmcgdGhlIGNvbG5hbWVzDQpjb2xuYW1lcyhkZl9tbClbOToxNF0gPC0gZ3N1YignTEZRIGludGVuc2l0eSAnLCAnJywgY29sbmFtZXMoZGZfbWwpWzk6MTRdKQ0KDQojIG1ha2luZyBsb25nZXIgZGF0YSBmcmFtZSB3aXRoIG9uZSBjb2x1bW4gY29udGFpbmluZyBhbGwgTEZRIHZhbHVlcw0KZGZfbWwgPC0gZGZfbWwgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHByb3QuaWQgPSBwYXN0ZSgncHJvdCcsMTpucm93KGRmX21sKSxzZXA9J18nKSkgfD4NCiAgICB0aWR5cjo6cGl2b3RfbG9uZ2VyKDk6MTQsIG5hbWVzX3RvID0gJ1NhbXBsZScsIHZhbHVlc190byA9ICdMRlF2YWx1ZScpIHw+DQogICAgdGlkeXI6OnNlcGFyYXRlKGNvbD1TYW1wbGUsIGludG89YygiY2VsbHR5cGUiLCJzYW1wbGV0eXBlIiwicmVwIiksIHNlcCA9ICJfIiwgcmVtb3ZlID0gRkFMU0UpIHw+DQogICAgZHBseXI6Om11dGF0ZShjZWxsdHlwZSA9IGFzLmZhY3RvcihjZWxsdHlwZSksIHNhbXBsZXR5cGUgPSBhcy5mYWN0b3Ioc2FtcGxldHlwZSksDQogICAgICAgICAgICAgICAgICByZXAgPSBhcy5mYWN0b3IocmVwKSkNCg0KIyBjaGFuZ2luZyB2YWx1ZXMgd2l0aCAwIHRvIE5BDQpkZl9tbCRMRlF2YWx1ZVtkZl9tbCRMRlF2YWx1ZT09MF0gPC0gTkENCg0KZGZfbWwkbWlzc2luZ25lc3MgPC0gYXNzaWduX21pc3NpbmcoZGZfbWwkcHJvdC5pZCwgZGZfbWwkY2VsbHR5cGUsIGRmX21sJExGUXZhbHVlKSRtaXNzaW5nbmVzcw0KDQojIHJlbW92aW5nIGJsYW5rIHNwYWNlcyBhbmQgYWxsIHNlcGFyYXRvcnMgZnJvbSBjb2xuYW1lcw0KY29sbmFtZXMoZGZfbWwpWzE6OF0gPC0gYygnbm8ucHJvdGVpbnMnLCAncGVwdGlkZXMnLCdzZXEuY292ZXJhZ2UnLCdzZXEubGVuJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vbC53ZWlnaHQua0RhJywncS52YWx1ZScsJ3Njb3JlJywnbXMuY291bnQnKQ0KDQojIFJlbW92ZSB1bm5lY2Vzc2FyeSBjb2x1bW5zIGFuZCByZW9yZGVyaW5nIGNvbHVtbnMNCmRmX21sLnRvLm1vZGVscyA8LSBkZl9tbCB8Pg0KICAgIGRwbHlyOjpzZWxlY3QoLXByb3QuaWQsIC1TYW1wbGUsIC1zYW1wbGV0eXBlKSB8PiBkcGx5cjo6c2VsZWN0KDE6MTAsIDEyLCAxMSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKG1pc3NpbmduZXNzID0gYXMubnVtZXJpYyhhcy5mYWN0b3IobWlzc2luZ25lc3MpKSwNCiAgICAgICAgICAgICAgICAgIGNlbGx0eXBlID0gYXMubnVtZXJpYyhjZWxsdHlwZSksDQogICAgICAgICAgICAgICAgICByZXAgPSBhcy5udW1lcmljKHJlcCkpDQoNCmRmX21sIDwtIGRmX21sIHw+DQogICAgZHBseXI6OnNlbGVjdCgtcHJvdC5pZCwgLVNhbXBsZSkgfD4gZHBseXI6OnNlbGVjdCgxOjExLCAxMywgMTIpIHw+DQogICAgZHBseXI6Om11dGF0ZShtaXNzaW5nbmVzcyA9IGFzLmZhY3RvcihtaXNzaW5nbmVzcykpDQpgYGANCg0KYGBge3IgZGF0YSB0byBwcm90dGl9DQpkZl90b19wcm90dGkgPC0gcHJvdGVpbi5ncm91cHMgfD4NCiAgICBkcGx5cjo6c2VsZWN0KGBQcm90ZWluIElEc2AsIGBQZXB0aWRlIHNlcXVlbmNlc2AsIA0KICAgICAgICAgICBjb250YWlucygnTEZRIGludGVuc2l0eScpICYgY29udGFpbnMoJ1RPVEFMUycpICYgKGVuZHNfd2l0aCgnMjInKSB8IGVuZHNfd2l0aCgnMjMnKSB8IGVuZHNfd2l0aCgnMjQnKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShgUHJvdGVpbiBJRHNgPSBwYXN0ZSgncHJvdF8nLCAxOm5yb3cocHJvdGVpbi5ncm91cHMpLCBzZXA9JycpKSB8Pg0KICAgIHRpZHlyOjpwaXZvdF9sb25nZXIoMzo4LCBuYW1lc190byA9ICdTYW1wbGUnLCB2YWx1ZXNfdG8gPSAnSW50ZW5zaXR5Jyl8Pg0KICAgIGRwbHlyOjptdXRhdGUoU2FtcGxlID0gZ3N1YignTEZRIGludGVuc2l0eSAnLCAnJywgU2FtcGxlKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKFNhbXBsZSA9IGdzdWIoJ19UT1RBTFNfJywgJ18nLCBTYW1wbGUpKSB8Pg0KICAgIHRpZHlyOjpzZXBhcmF0ZShjb2wgPSAgU2FtcGxlLCBpbnRvID0gYygiY2VsbHR5cGUiLCJyZXAiKSwgc2VwID0gIl8iLCByZW1vdmUgPSBGKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoQ29uZGl0aW9uID0gaWZlbHNlKGNlbGx0eXBlID09ICdLTycsICd0cmVhdGVkJywgJ2NvbnRyb2wnKSwNCiAgICAgICAgICAgSW50ZW5zaXR5ID0gaWZlbHNlKEludGVuc2l0eSA9PSAwLCBOQSwgbG9nMihJbnRlbnNpdHkpKSkgfD4gDQogICAgZHBseXI6OnNlbGVjdChTYW1wbGUsIGBQcm90ZWluIElEc2AsIGBQZXB0aWRlIHNlcXVlbmNlc2AsIENvbmRpdGlvbiwgSW50ZW5zaXR5KSANCmBgYA0KDQpgYGB7ciB0cmFpbi90ZXN0IHNwbGl0fQ0KIyBjcmVhdGluZyBkYXRhIHdpdGggbm8gTkEgdG8gdHJhaW4gbW9kZWxzDQpkZl9tbC5uby5uYSA8LSBuYS5vbWl0KGRmX21sLnRvLm1vZGVscykNCg0KIyBzZXQgc2VlZCB0byBhdm9pZCBkaWZmZXJlbnQgbW9kZWxzIGFuZCB0ZXN0L3RyYWluIGRhdGEgd2l0aCBlYWNoIHJ1bg0Kc2V0LnNlZWQoMTIzKQ0KIyBzcGxpdCBkYXRhIHRvIHRyYWluIGFuZCB0ZXN0DQp0cmFpbl9kYXRhX2lkeCA8LSBzYW1wbGUoMTpucm93KGRmX21sLm5vLm5hKSwgY2VpbGluZygwLjcqbnJvdyhkZl9tbC5uby5uYSkpKQ0KdHJhaW5fZGF0YSA8LSBkZl9tbC5uby5uYVt0cmFpbl9kYXRhX2lkeCxdDQpgYGANCg0KYGBge3IgaW1wdXRhdGlvbiBSRn0NCiMgdHJhaW5pbmcgcmFuZG9tIGZvcmVzdCBtb2RlbA0KcmYubW9kZWwgPC0gcmFuZ2VyOjpyYW5nZXIoTEZRdmFsdWUgfiAuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXRyYWluX2RhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG51bS50cmVlcyA9IDEwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXRyeSA9IDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi5ub2RlLnNpemUgPSA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5mcmFjdGlvbiA9IDAuOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDEyMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW5jZSA9ICdpbXB1cml0eScpDQoNCiMgZXh0cmFjdGluZyBtaXNzaW5nIHJvd3MgLSBjYW4gYmUgdXNlZnVsbCBsYXRlcg0KbWlzc2luZyA8LSB3aGljaChpcy5uYShkZl9tbCRMRlF2YWx1ZSkpDQoNCiMgcHJlZGljdCB0aGUgdmFsdWVzIGZvciBOQSByb3dzDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0KHJmLm1vZGVsLCBkZl9tbC50by5tb2RlbHNbbWlzc2luZyxdKQ0KDQojIGRhdGEgZnJhbWUgd2l0aCBwcmVkaWN0ZWQgTEZRIHZhbHVlcyBieSByYW5kb20gZm9yZXN0IG1vZGVsDQppbXB1dGVkX1JGIDwtIGRmX21sDQppbXB1dGVkX1JGW21pc3NpbmcsMTNdIDwtIHByZWRpY3Rpb25zJHByZWRpY3Rpb25zDQppbXB1dGVkX1JGIDwtIGltcHV0ZWRfUkYgfD4NCiAgICBkcGx5cjo6c2VsZWN0KGNlbGx0eXBlLCByZXAsIExGUXZhbHVlKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoJ0JhdGNoJyA9IHBhc3RlKGNlbGx0eXBlLCByZXAsIHNlcD0nLicpLA0KICAgICAgICAgICAgICAgICAgTEZRdmFsdWUgPSBsb2cyKExGUXZhbHVlKSkgfD4NCiAgICBkcGx5cjo6c2VsZWN0KEJhdGNoLCBMRlF2YWx1ZSkgfD4NCiAgICB0aWR5cjo6cGl2b3Rfd2lkZXIoaWRfY29scz1ldmVyeXRoaW5nKCksIG5hbWVzX2Zyb20gPSBCYXRjaCwgdmFsdWVzX2Zyb20gPSBMRlF2YWx1ZSwgdmFsdWVzX2ZuID0gbGlzdCkgfD4NCiAgICB1bm5lc3QoY29scyA9IGMoS08uMjIsIEtPLjIzLCBLTy4yNCwgV1QuMjIsIFdULjIzLCBXVC4yNCkpDQoNCiMgZXh0cmFjdGluZyBLTyBhbmQgV1QNCkxGUV9LT19SRiA8LSBpbXB1dGVkX1JGIHw+IGRwbHlyOjpzZWxlY3QoY29udGFpbnMoJ0tPJykpDQpMRlFfV1RfUkYgPC0gaW1wdXRlZF9SRiB8PiBkcGx5cjo6c2VsZWN0KGNvbnRhaW5zKCdXVCcpKQ0KYGBgDQoNCmBgYHtyIGltcHV0YXRpb24ga05OfQ0KIyBjYWxjdWxhdGluZyBrTk4gbW9kZWwNCmtOTi5tb2RlbCA8LSBjYXJldDo6dHJhaW4oTEZRdmFsdWUgfiAuLCBkYXRhPXRyYWluX2RhdGEsIG1ldGhvZD0na25uJykNCg0KIyBwcmVkaWN0IHRoZSB2YWx1ZXMgZm9yIE5BIHJvd3MNCnByZWRpY3Rpb25zMiA8LSBwcmVkaWN0KGtOTi5tb2RlbCwgZGZfbWwudG8ubW9kZWxzW21pc3NpbmcsMToxMl0pDQoNCiMgZGF0YSBmcmFtZSB3aXRoIHByZWRpY3RlZCBMRlEgdmFsdWVzIGJ5IHJhbmRvbSBmb3Jlc3QgbW9kZWwNCmltcHV0ZWRfa05OIDwtIGRmX21sDQppbXB1dGVkX2tOTlttaXNzaW5nLDEzXSA8LSBwcmVkaWN0aW9uczINCmltcHV0ZWRfa05OIDwtIGltcHV0ZWRfa05OIHw+DQogICAgZHBseXI6OnNlbGVjdChjZWxsdHlwZSwgcmVwLCBMRlF2YWx1ZSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCdCYXRjaCcgPSBwYXN0ZShjZWxsdHlwZSwgcmVwLCBzZXA9Jy4nKSwNCiAgICAgICAgICAgICAgICAgIExGUXZhbHVlID0gbG9nMihMRlF2YWx1ZSkpIHw+DQogICAgZHBseXI6OnNlbGVjdChCYXRjaCwgTEZRdmFsdWUpIHw+DQogICAgdGlkeXI6OnBpdm90X3dpZGVyKGlkX2NvbHM9ZXZlcnl0aGluZygpLCBuYW1lc19mcm9tID0gQmF0Y2gsIHZhbHVlc19mcm9tID0gTEZRdmFsdWUsIHZhbHVlc19mbiA9IGxpc3QpIHw+DQogICAgdW5uZXN0KGNvbHMgPSBjKEtPLjIyLCBLTy4yMywgS08uMjQsIFdULjIyLCBXVC4yMywgV1QuMjQpKQ0KDQojIGV4dHJhY3RpbmcgS08gYW5kIFdUDQpMRlFfS09fa05OIDwtIGltcHV0ZWRfa05OIHw+IGRwbHlyOjpzZWxlY3QoY29udGFpbnMoJ0tPJykpDQpMRlFfV1Rfa05OIDwtIGltcHV0ZWRfa05OIHw+IGRwbHlyOjpzZWxlY3QoY29udGFpbnMoJ1dUJykpDQpgYGANCg0KYGBge3IgbHVkb3ZpYyBpbXB1dGF0aW9ufQ0KIyBhc3NpZ24gbWlzc2luZ25lc3Mgd2l0aCBwcm90dGkgZnhuDQpkYXRhX21pc3NpbmcgPC0gZGZfdG9fcHJvdHRpIHw+DQogICAgYXNzaWduX21pc3NpbmduZXNzKHNhbXBsZT1TYW1wbGUsDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IENvbmRpdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcgPSBgUHJvdGVpbiBJRHNgLA0KICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSBJbnRlbnNpdHksDQogICAgICAgICAgICAgICAgICAgICAgIHJlZl9jb25kaXRpb24gPSAnYWxsJykNCg0KIyBpbXB1dGUgZGF0YSB3aXRoIHByb3R0aSBmeG4gdXNpbmcgbHVkb3ZpYyBtZXRob2QNCmltcHV0ZWRfbHVkb3ZpYyA8LSBpbXB1dGUoDQogICAgZGF0YV9taXNzaW5nLA0KICAgIHNhbXBsZSA9IFNhbXBsZSwNCiAgICBncm91cGluZyA9IGBQcm90ZWluIElEc2AsDQogICAgaW50ZW5zaXR5X2xvZzIgPSBJbnRlbnNpdHksDQogICAgY29uZGl0aW9uID0gQ29uZGl0aW9uLA0KICAgIGNvbXBhcmlzb24gPSBjb21wYXJpc29uLA0KICAgIG1pc3NpbmduZXNzID0gbWlzc2luZ25lc3MsDQogICAgbWV0aG9kID0gJ2x1ZG92aWMnLA0KICAgIHNraXBfbG9nMl90cmFuc2Zvcm1fZXJyb3IgPSBUUlVFDQopDQpybShkYXRhX21pc3NpbmcpDQoNCiMgcmVtb3ZlIHRoZSBOQSB2YWx1ZXMgDQppbXB1dGVkX2x1ZG92aWMgPC0gaW1wdXRlZF9sdWRvdmljW3doaWNoKCFpcy5uYShpbXB1dGVkX2x1ZG92aWMkbWlzc2luZ25lc3MpKSxdDQoNCiMgZXh0cmFjdGluZyBLTyBhbmQgV1QNCmltcHV0ZWRfbHVkb3ZpYyA8LSBpbXB1dGVkX2x1ZG92aWMgfD4NCiAgICBkcGx5cjo6c2VsZWN0KFNhbXBsZSwgaW1wdXRlZF9pbnRlbnNpdHksIGBQcm90ZWluIElEc2AsIG1pc3NpbmduZXNzKSB8Pg0KICAgIHRpZHlyOjpwaXZvdF93aWRlcihpZF9jb2xzID0gZXZlcnl0aGluZygpLCBuYW1lc19mcm9tID0gU2FtcGxlLCB2YWx1ZXNfZnJvbSA9IGltcHV0ZWRfaW50ZW5zaXR5KQ0KDQpMRlFfS09fbHVkb3ZpYyA8LSBpbXB1dGVkX2x1ZG92aWMgfD4gZHBseXI6OnNlbGVjdChjb250YWlucygnS08nKSkNCkxGUV9XVF9sdWRvdmljIDwtIGltcHV0ZWRfbHVkb3ZpYyB8PiBkcGx5cjo6c2VsZWN0KGNvbnRhaW5zKCdXVCcpKQ0KYGBgDQoNCiMgRGlzdHJpYnV0aW9ucyB7LnRhYnNldH0NCg0KKipTdW1tYXJ5Kio8YnI+DQpCZWxvdyB3ZSBjYW4gc2VlIHRoZSBkaXN0cmlidXRpb24gb2Ygbm9uLWltcHV0ZWQgZGF0YSBhbmQgZGF0YSBpbXB1dGVkIHdpdGggNCBtZXRob2RzOg0KDQoxLiBTaGlmdGVkIERpc3RyaWJ1dGlvbiBiYXNlZCBvbiB0aGUgZGF0YTsNCjIuIEltcHV0YXRpb24gdXNpbmcgdGhlIFJhbmRvbSBGb3Jlc3QgYWxnb3JpdGhtOw0KMy4gSW1wdXRhdGlvbiB1c2luZyB0aGUgay1OZWFyZXN0IE5laWdoYm9ycyBhbGdvcml0aG07DQo0LiBJbXB1dGF0aW9uIHVzaW5nIHRoZSBsdWRvdmljIG1ldGhvZC4NCg0KRm9yIGVhY2ggaGlzdG9ncmFtLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIDI0dGggcmVwbGljYXRlIChibHVlIGNvbG91cikgb2YgdGhlIEtPIA0KY2VsbCB0eXBlICBoYXMgYSBkaXN0cmlidXRpb24gc2hpZnQgdG8gdGhlIHJpZ2h0LiBPdXIgZ29hbCBpcyB0byBnZXQgdGhpcyANCmRpc3RyaWJ1dGlvbiBjbG9zZXIgdG8gdGhlIG90aGVycywgYW5kIHdlIGNhbiBkbyB0aGlzIHVzaW5nIGRpZmZlcmVudCANCm5vcm1hbGl6YXRpb24gbWV0aG9kcy4NCg0KIyMgTWF0aSBDb2RlDQoNCmBgYHtyIGRpc3RyaWJ1dGlvbnMgbWF0aSBjb2RlfQ0KZ2dhcnJhbmdlKA0KICAgIHBsb3RoaXN0KExGUV9LTywgJycsIEZBTFNFKSArIHhsYWIoJ0tPJykgKyBnZ3RpdGxlKCdOb24tSW1wdXRlZCcpLCANCiAgICBwbG90aGlzdChMRlFfV1QsICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpICsgZ2d0aXRsZSgnJyksDQogICAgcGxvdGhpc3QoTEZRX0tPX2ltcCwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJykgKyBnZ3RpdGxlKCdJbXB1dGVkJyksIA0KICAgIHBsb3RoaXN0KExGUV9XVF9pbXAsICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpICsgZ2d0aXRsZSgnJyksDQogICAgbnJvdz0yLG5jb2w9Mg0KKQ0KYGBgDQoNCiMjIFJhbmRvbSBGb3Jlc3QNCg0KYGBge3IgZGlzdHJpYnV0aW9uIHJmfQ0KZ2dhcnJhbmdlKA0KICAgIHBsb3RoaXN0KExGUV9LTywgJycsIEZBTFNFKSArIHhsYWIoJ0tPJykgKyBnZ3RpdGxlKCdOb24tSW1wdXRlZCcpLCANCiAgICBwbG90aGlzdChMRlFfV1QsICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpICsgZ2d0aXRsZSgnJyksDQogICAgcGxvdGhpc3QoTEZRX0tPX1JGLCAnJywgRkFMU0UpICsgeGxhYignS08nKSArIGdndGl0bGUoJ0ltcHV0ZWQgLSBSYW5kb20gRm9yZXN0JyksIA0KICAgIHBsb3RoaXN0KExGUV9XVF9SRiwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJykgKyBnZ3RpdGxlKCcnKSwNCiAgICBucm93PTIsbmNvbD0yDQopDQpgYGANCg0KIyMgay1OZWFyZXN0IE5laWdoYm9ycw0KDQpgYGB7ciBkaXN0cmlidXRpb24ga05OfQ0KZ2dhcnJhbmdlKA0KICAgIHBsb3RoaXN0KExGUV9LTywgJycsIEZBTFNFKSArIHhsYWIoJ0tPJykgKyBnZ3RpdGxlKCdOb24tSW1wdXRlZCcpLCANCiAgICBwbG90aGlzdChMRlFfV1QsICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpICsgZ2d0aXRsZSgnJyksDQogICAgcGxvdGhpc3QoTEZRX0tPX2tOTiwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJykgKyBnZ3RpdGxlKCdJbXB1dGVkIC0ga05OJyksIA0KICAgIHBsb3RoaXN0KExGUV9XVF9rTk4sICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpICsgZ2d0aXRsZSgnJyksDQogICAgbnJvdz0yLG5jb2w9Mg0KKQ0KYGBgDQoNCiMjIEx1ZG92aWMNCg0KYGBge3IgZGlzdHJpYnV0aW9uIGx1ZG92aWN9DQpnZ2FycmFuZ2UoDQogICAgcGxvdGhpc3QoTEZRX0tPLCAnJywgRkFMU0UpICsgeGxhYignS08nKSArIGdndGl0bGUoJ05vbi1JbXB1dGVkJyksIA0KICAgIHBsb3RoaXN0KExGUV9XVCwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJykgKyBnZ3RpdGxlKCcnKSwNCiAgICBwbG90aGlzdChMRlFfS09fbHVkb3ZpYywgJycsIEZBTFNFKSArIHhsYWIoJ0tPJykgKyBnZ3RpdGxlKCdJbXB1dGVkIC0gTHVkb3ZpYycpLCANCiAgICBwbG90aGlzdChMRlFfV1RfbHVkb3ZpYywgJycsIEZBTFNFKSArIHhsYWIoJ1dUJykgKyBnZ3RpdGxlKCcnKSwNCiAgICBucm93PTIsbmNvbD0yDQopDQpgYGANCg0KIyBOb3JtYWxpemF0aW9uIHsudGFic2V0fQ0KDQpUaGUgMjR0aCByZXBsaWNhdGUgb2YgdGhlIEtPIGNlbGwgdHlwZSBoYXMgdGhlIGRpc3RyaWJ1dGlvbiBzaGlmdGVkIHRvIHRoZSByaWdodCBhbmQgDQpzaG91bGQgYmUgbW9yZSBzaW1pbGFyIHRvIHRoZSBvdGhlciByZXBsaWNhdGVzLiBUaGVyZWZvcmUgd2UgdHJpZWQgc2V2ZXJhbA0Kbm9ybWFsaXphdGlvbiBtZXRob2RzIHRvIGFjaGlldmUgdGhpcyBnb2FsLiBXZSB1c2VkIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoNCg0KMS4gWi1TY29yZQ0KMi4gTWluLU1heA0KMy4gTWVkaWFuIFNjYWxpbmcNCjQuIE1BRCAoTWVkaWFuIEFic29sdXRlIERldmlhdGlvbikgU2NhbGluZw0KNS4gTGluZWFyIFJlZ3Jlc3Npb24NCjYuIFZTTiAoVmFyaWFuY2UgU3RhYmlsaXphdGlvbiBOb3JtYWxpemF0aW9uKQ0KNy4gRWlnZW5NUw0KDQojIyBaLVNjb3JlDQoNCioqWi1zY29yZSoqIG5vcm1hbGl6YXRpb24gc3RhbmRhcmRpemVzIGRhdGEgYnkgc3VidHJhY3RpbmcgdGhlIG1lYW4gYW5kIGRpdmlkaW5nIA0KYnkgdGhlIHN0YW5kYXJkIGRldmlhdGlvbi4gVGhpcyB0ZWNobmlxdWUgdHJhbnNmb3JtcyBkYXRhIGludG8gYSBkaXN0cmlidXRpb24gDQp3aXRoIGEgbWVhbiBvZiAwIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxLg0KDQpGb3JtdWxhOiAkXHRpbGRle3l9X3tpan0gPSBcZnJhY3t5X2lqIC0gXGJhcnt5X2p9fXtcdGhldGFfan0kLCB3aGVyZToNCg0KKiAkeV9paiQgLSB2YWx1ZSBvZiB0aGUgTEZROw0KKiAkXGJhcnt5X2p9JCAtIG1lYW4gb2YgdGhlIExGUSB2YWx1ZXM7DQoqICRcdGhldGFfaiQgLSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIExGUSB2YWx1ZXMuDQoNCmBgYHtyIEtPIHN0YW5kYXJkaXphdGlvbn0NCkxGUV9LTy5zdGFuZGFyZCA8LSBhcy5kYXRhLmZyYW1lKHNjYWxlKExGUV9LTykpICMgTm9uLUltcHV0ZWQNCkxGUV9LT19pbXAuc3RhbmRhcmQgPC0gYXMuZGF0YS5mcmFtZShzY2FsZShMRlFfS09faW1wKSkgIyBJbXB1dGVkIC0gTWF0aSBDb2RlDQpMRlFfS09fUkYuc3RhbmRhcmQgPC0gYXMuZGF0YS5mcmFtZShzY2FsZShMRlFfS09fUkYpKSAjIEltcHV0ZWQgUkYNCkxGUV9LT19rTk4uc3RhbmRhcmQgPC0gYXMuZGF0YS5mcmFtZShzY2FsZShMRlFfS09fa05OKSkgIyBJbXB1dGVkIGtOTg0KTEZRX0tPX2x1ZG92aWMuc3RhbmRhcmQgPC0gYXMuZGF0YS5mcmFtZShzY2FsZShMRlFfS09fbHVkb3ZpYykpICMgSW1wdXRlZCBsdWRvdmljDQpgYGANCg0KYGBge3IgV1Qgc3RhbmRhcmRpemF0aW9ufQ0KTEZRX1dULnN0YW5kYXJkIDwtIGFzLmRhdGEuZnJhbWUoc2NhbGUoTEZRX1dUKSkgIyBOb24tSW1wdXRlZA0KTEZRX1dUX2ltcC5zdGFuZGFyZCA8LSBhcy5kYXRhLmZyYW1lKHNjYWxlKExGUV9XVF9pbXApKSAjIEltcHV0ZWQgLSBNYXRpIENvZGUNCkxGUV9XVF9SRi5zdGFuZGFyZCA8LSBhcy5kYXRhLmZyYW1lKHNjYWxlKExGUV9XVF9SRikpICMgSW1wdXRlZCBSRg0KTEZRX1dUX2tOTi5zdGFuZGFyZCA8LSBhcy5kYXRhLmZyYW1lKHNjYWxlKExGUV9XVF9rTk4pKSAjIEltcHV0ZWQga05ODQpMRlFfV1RfbHVkb3ZpYy5zdGFuZGFyZCA8LSBhcy5kYXRhLmZyYW1lKHNjYWxlKExGUV9XVF9sdWRvdmljKSkgIyBJbXB1dGVkIGx1ZG92aWMNCmBgYA0KDQoqKlN1bW1hcnkqKiA8YnI+DQpUaGUgWi1TQ09SRSBtZXRob2QgYnJvdWdodCB0aGUgZGlzdHJpYnV0aW9uIGNsb3NlciB0b2dldGhlciwgYnV0IHdlIGxvc3QNCnRoZSBvcmlnaW5hbCBzY2FsZSBvZiB0aGUgZGF0YSBhbmQgdGhlIGRpZmZlcmVuY2VzIGFyZSBoYXJkZXIgdG8gc2VlIGFmdGVyIG5vcm1hbGl6YXRpb24uDQoNCjxjZW50ZXI+PGIgc3R5bGU9J2ZvbnQtc2l6ZToyMHB4Jz5ESVNUUklCVVRJT05TPC9iPjwvY2VudGVyPg0KDQpgYGB7ciBkaXN0IHN0YW5kYXJkaXphdGlvbiwgZmlnLmhlaWdodD00fQ0KYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICBwbG90aGlzdChMRlFfS08uc3RhbmRhcmQsIE5VTEwsIFRSVUUpICsgeGxhYignS08nKSwgDQogICAgcGxvdGhpc3QoTEZRX1dULnN0YW5kYXJkLCBOVUxMLCBUUlVFKSArIHhsYWIoJ1dUJyksDQogICAgbnJvdz0xLG5jb2w9Mg0KICAgICksIHRvcCA9IHRleHRfZ3JvYignTm9uLUltcHV0ZWQgRGF0YScsIHNpemUgPSAxNikNCikNCmBgYA0KDQpgYGB7cn0NCmdnYXJyYW5nZSgNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09faW1wLnN0YW5kYXJkLCAnJywgRkFMU0UpICsgeGxhYignS08nKSwgDQogICAgICAgIHBsb3RoaXN0KExGUV9XVF9pbXAuc3RhbmRhcmQsICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpLA0KICAgICAgICBucm93PTEsbmNvbD0yDQogICAgICAgICksIHRvcCA9IHRleHRfZ3JvYignSW1wdXRlZCBEYXRhIC0gTWF0aSBDb2RlJywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX1JGLnN0YW5kYXJkLCAnJywgRkFMU0UpICsgeGxhYignS08nKSwgDQogICAgICAgIHBsb3RoaXN0KExGUV9XVF9SRi5zdGFuZGFyZCwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBSYW5kb20gRm9yZXN0Jywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgbnJvdz0yLG5jb2w9MQ0KKQ0KZ2dhcnJhbmdlKA0KICAgIGFubm90YXRlX2ZpZ3VyZShnZ2FycmFuZ2UoDQogICAgICAgIHBsb3RoaXN0KExGUV9LT19rTk4uc3RhbmRhcmQsICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX2tOTi5zdGFuZGFyZCwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBrTk4nLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09fbHVkb3ZpYy5zdGFuZGFyZCwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1RfbHVkb3ZpYy5zdGFuZGFyZCwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBMdWRvdmljJywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgbnJvdz0yLG5jb2w9MQ0KKQ0KYGBgDQoNCiMjIE1pbi1NYXgNCg0KKipNaW4tbWF4Kiogbm9ybWFsaXphdGlvbiBzY2FsZXMgZGF0YSB0byBhIHNwZWNpZmllZCByYW5nZSAodXN1YWxseSBbMCwgMV0pIGJ5IA0Kc3VidHJhY3RpbmcgdGhlIG1pbmltdW0gdmFsdWUgYW5kIGRpdmlkaW5nIGJ5IHRoZSByYW5nZSBvZiB2YWx1ZXMuDQoNCmBgYHtyIG1pbm1heH0NCm1pbl9tYXhfbm9ybSA8LSBmdW5jdGlvbihkZikgew0KICAgIGRmX25vX25hIDwtIG5hLm9taXQoZGYpDQogICAgcmV0IDwtIHNjYWxlKGRmX25vX25hLCBjZW50ZXIgPSBtaW4oZGZfbm9fbmEpLCBzY2FsZSA9IG1heChkZl9ub19uYSkgLSBtaW4oZGZfbm9fbmEpKQ0KICAgIGRmW3doaWNoKCFpcy5uYShkZikpXSA8LSByZXQNCiAgICByZXR1cm4oZGYpDQp9DQoNCkxGUV9LTy5taW5tYXggPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoTEZRX0tPLCBmdW5jdGlvbihjb2wpIG1pbl9tYXhfbm9ybShjb2wpKSkgICMgTm9uLUltcHV0ZWQNCkxGUV9LT19pbXAubWlubWF4IDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KExGUV9LT19pbXAsIGZ1bmN0aW9uKGNvbCkgbWluX21heF9ub3JtKGNvbCkpKSAgIyBJbXB1dGVkDQpMRlFfS09fUkYubWlubWF4IDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KExGUV9LT19SRiwgZnVuY3Rpb24oY29sKSBtaW5fbWF4X25vcm0oY29sKSkpICAjIEltcHV0ZWQgUkYNCkxGUV9LT19rTk4ubWlubWF4IDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KExGUV9LT19rTk4sIGZ1bmN0aW9uKGNvbCkgbWluX21heF9ub3JtKGNvbCkpKSAgIyBJbXB1dGVkIGtOTg0KTEZRX0tPX2x1ZG92aWMubWlubWF4IDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KExGUV9LT19sdWRvdmljLCBmdW5jdGlvbihjb2wpIG1pbl9tYXhfbm9ybShjb2wpKSkgICMgSW1wdXRlZCBsdWRvdmljDQoNCkxGUV9XVC5taW5tYXggPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoTEZRX1dULCBmdW5jdGlvbihjb2wpIG1pbl9tYXhfbm9ybShjb2wpKSkgICMgTm9uLUltcHV0ZWQNCkxGUV9XVF9pbXAubWlubWF4IDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KExGUV9XVF9pbXAsIGZ1bmN0aW9uKGNvbCkgbWluX21heF9ub3JtKGNvbCkpKSAgIyBJbXB1dGVkDQpMRlFfV1RfUkYubWlubWF4IDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KExGUV9XVF9SRiwgZnVuY3Rpb24oY29sKSBtaW5fbWF4X25vcm0oY29sKSkpICAjIEltcHV0ZWQgUkYNCkxGUV9XVF9rTk4ubWlubWF4IDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KExGUV9XVF9rTk4sIGZ1bmN0aW9uKGNvbCkgbWluX21heF9ub3JtKGNvbCkpKSAgIyBJbXB1dGVkIGtOTg0KTEZRX1dUX2x1ZG92aWMubWlubWF4IDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KExGUV9XVF9sdWRvdmljLCBmdW5jdGlvbihjb2wpIG1pbl9tYXhfbm9ybShjb2wpKSkgICMgSW1wdXRlZCBsdWRvdmljDQpgYGANCg0KKipTdW1tYXJ5KiogPGJyPg0KVGhlIE1JTi1NQVggbWV0aG9kIGRpZG4ndCBzdWNjZWVkIGluIGJyaW5naW5nIHRoZSBkaXN0cmlidXRpb24gY2xvc2VyIHRvZ2V0aGVyLiANCkluIGNvbmNsdXNpb24sIHdlIHByb2JhYmx5IHNob3VsZG4ndCB1c2UgdGhpcyBtZXRob2QuDQoNCjxjZW50ZXI+PGIgc3R5bGU9J2ZvbnQtc2l6ZToyMHB4Jz5ESVNUUklCVVRJT05TPC9iPjwvY2VudGVyPg0KDQpgYGB7ciBkaXN0IG1pbm1heCwgZmlnLmhlaWdodD00fQ0KYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICBwbG90aGlzdChMRlFfS08ubWlubWF4LCBOVUxMLCBUUlVFKSArIHhsYWIoJ0tPJyksIA0KICAgIHBsb3RoaXN0KExGUV9XVC5taW5tYXgsIE5VTEwsIFRSVUUpICsgeGxhYignV1QnKSwNCiAgICBucm93PTEsbmNvbD0yDQogICAgKSwgdG9wID0gdGV4dF9ncm9iKCdOb24tSW1wdXRlZCBEYXRhJywgc2l6ZSA9IDE2KQ0KKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dhcnJhbmdlKA0KICAgIGFubm90YXRlX2ZpZ3VyZShnZ2FycmFuZ2UoDQogICAgICAgIHBsb3RoaXN0KExGUV9LT19pbXAubWlubWF4LCAnJywgRkFMU0UpICsgeGxhYignS08nKSwgDQogICAgICAgIHBsb3RoaXN0KExGUV9XVF9pbXAubWlubWF4LCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIE1hdGkgQ29kZScsIHNpemUgPSAxNikNCiAgICApLA0KICAgIGFubm90YXRlX2ZpZ3VyZShnZ2FycmFuZ2UoDQogICAgICAgIHBsb3RoaXN0KExGUV9LT19SRi5taW5tYXgsICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX1JGLm1pbm1heCwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBSYW5kb20gRm9yZXN0Jywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgbnJvdz0yLG5jb2w9MQ0KKQ0KDQpnZ2FycmFuZ2UoDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX2tOTi5taW5tYXgsICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX2tOTi5taW5tYXgsICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpLA0KICAgICAgICBucm93PTEsbmNvbD0yDQogICAgICAgICksIHRvcCA9IHRleHRfZ3JvYignSW1wdXRlZCBEYXRhIC0ga05OJywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX2x1ZG92aWMubWlubWF4LCAnJywgRkFMU0UpICsgeGxhYignS08nKSwgDQogICAgICAgIHBsb3RoaXN0KExGUV9XVF9sdWRvdmljLm1pbm1heCwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBMdWRvdmljJywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgbnJvdz0yLG5jb2w9MQ0KKQ0KYGBgDQoNCiMjIE1lZGlhbiBTY2FsaW5nDQoNCioqTWVkaWFuIFNjYWxpbmcqKiwgYWxzbyBjYWxsZWQgdGhlIFJvYnVzdCBTY2FsYXIsIHRyYW5zZm9ybXMgeCB0byB44oCZIGJ5IHN1YnRyYWN0aW5nIGVhY2ggDQp2YWx1ZSBvZiBmZWF0dXJlcyBieSB0aGUgbWVkaWFuIGFuZCBkaXZpZGluZyBpdCBieSB0aGUgaW50ZXJxdWFydGlsZSByYW5nZSBiZXR3ZWVuIA0KdGhlIDFzdCBxdWFydGlsZSAoMjV0aCBxdWFudGlsZSkgYW5kIHRoZSAzcmQgcXVhcnRpbGUgKDc1dGggcXVhbnRpbGUpLiBUaGUgZm9ybXVsYToNCg0KJCR4JyA9IFxmcmFje3gtbWVkaWFuKHgpfXsoUTMtUTEpfSQkDQoNCmBgYHtyIG1lZGlhbiBzY2FsaW5nfQ0KTEZRX0tPLm1lZCA8LSBhcy5kYXRhLmZyYW1lKERlc2NUb29sczo6Um9iU2NhbGUoTEZRX0tPLCBzY2FsZT1GQUxTRSkpICMgTm9uLUltcHV0ZWQNCkxGUV9LT19pbXAubWVkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfS09faW1wLCBzY2FsZT1GQUxTRSkpICMgSW1wdXRlZA0KTEZRX0tPX1JGLm1lZCA8LSBhcy5kYXRhLmZyYW1lKERlc2NUb29sczo6Um9iU2NhbGUoTEZRX0tPX1JGLCBzY2FsZT1GQUxTRSkpICMgSW1wdXRlZA0KTEZRX0tPX2tOTi5tZWQgPC0gYXMuZGF0YS5mcmFtZShEZXNjVG9vbHM6OlJvYlNjYWxlKExGUV9LT19rTk4sIHNjYWxlPUZBTFNFKSkgIyBJbXB1dGVkDQpMRlFfS09fbHVkb3ZpYy5tZWQgPC0gYXMuZGF0YS5mcmFtZShEZXNjVG9vbHM6OlJvYlNjYWxlKExGUV9LT19sdWRvdmljLCBzY2FsZT1GQUxTRSkpICMgSW1wdXRlZA0KDQpMRlFfV1QubWVkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfV1QsIHNjYWxlPUZBTFNFKSkgIyBOb24tSW1wdXRlZA0KTEZRX1dUX2ltcC5tZWQgPC0gYXMuZGF0YS5mcmFtZShEZXNjVG9vbHM6OlJvYlNjYWxlKExGUV9XVF9pbXAsIHNjYWxlPUZBTFNFKSkgIyBJbXB1dGVkDQpMRlFfV1RfUkYubWVkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfV1RfUkYsIHNjYWxlPUZBTFNFKSkgIyBJbXB1dGVkDQpMRlFfV1Rfa05OLm1lZCA8LSBhcy5kYXRhLmZyYW1lKERlc2NUb29sczo6Um9iU2NhbGUoTEZRX1dUX2tOTiwgc2NhbGU9RkFMU0UpKSAjIEltcHV0ZWQNCkxGUV9XVF9sdWRvdmljLm1lZCA8LSBhcy5kYXRhLmZyYW1lKERlc2NUb29sczo6Um9iU2NhbGUoTEZRX1dUX2x1ZG92aWMsIHNjYWxlPUZBTFNFKSkgIyBJbXB1dGVkDQpgYGANCg0KKipTdW1tYXJ5Kio8YnI+DQpUaGUgTUVESUFOIHNjYWxpbmcgbWV0aG9kIGJyb3VnaHQgdGhlIGRpc3RyaWJ1dGlvbnMgY2xvc2VyIHRvZ2V0aGVyLCBidXQgYWdhaW4gd2UgbG9zdA0KdGhlIG9yaWdpbmFsIHNjYWxlIG9mIHRoZSBkYXRhIGFuZCB0aGUgZGlmZmVyZW5jZXMgYXJlIGhhcmRlciB0byBzZWUgYWZ0ZXIgbm9ybWFsaXphdGlvbi4NCg0KPGNlbnRlcj48YiBzdHlsZT0nZm9udC1zaXplOjIwcHgnPkRJU1RSSUJVVElPTlM8L2I+PC9jZW50ZXI+DQoNCmBgYHtyIGRpc3QgbWVkaWFuLCBmaWcuaGVpZ2h0PTR9DQphbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgIHBsb3RoaXN0KExGUV9LTy5tZWQsIE5VTEwsIFRSVUUpICsgeGxhYignS08nKSwgDQogICAgcGxvdGhpc3QoTEZRX1dULm1lZCwgTlVMTCwgVFJVRSkgKyB4bGFiKCdXVCcpLA0KICAgIG5yb3c9MSxuY29sPTINCiAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ05vbi1JbXB1dGVkIERhdGEnLCBzaXplID0gMTYpDQopDQpgYGANCg0KYGBge3J9DQpnZ2FycmFuZ2UoDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX2ltcC5tZWQsICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX2ltcC5tZWQsICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpLA0KICAgICAgICBucm93PTEsbmNvbD0yDQogICAgICAgICksIHRvcCA9IHRleHRfZ3JvYignSW1wdXRlZCBEYXRhIC0gTWF0aSBDb2RlJywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX1JGLm1lZCwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1RfUkYubWVkLCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIFJhbmRvbSBGb3Jlc3QnLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBucm93PTIsbmNvbD0xDQopDQoNCmdnYXJyYW5nZSgNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09fa05OLm1lZCwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1Rfa05OLm1lZCwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBrTk4nLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09fbHVkb3ZpYy5tZWQsICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX2x1ZG92aWMubWVkLCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIEx1ZG92aWMnLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBucm93PTIsbmNvbD0xDQopDQpgYGANCg0KIyMgTUFEIFNjYWxpbmcNCg0KKipNQUQqKiAoKipNKiplZGlhbiAqKkEqKmJzb3VsdGUgKipEKipldmlhdGlvbikgKipTY2FsaW5nKiogdHJhbnNmb3JtcyAkeCQgdG8gJHgnJCBpbiANCnNpbWlsYXIgd2F5IGxpa2UgTWVkaWFuIFNjYWxpbmcsIGJ1dCBpdCBzdWJzdHJhY3Rpbmd0aGUgTUFEIHZhbHVlIGZyb20gdGhlICR4JC4gDQpUaGUgZm9ybXVsYSBvZiBNQUQ6DQoNCiQkXHRpbGRle1h9ID0gbWVkaWFuKFgpIFxcIE1BRCA9IG1lZGlhblxCaWcofFhfaSAtIFx0aWxkZXtYfXxcQmlnKSQkDQoNCmFuZCB0aGUgZm9ybXVsYSBvZiBzY2FsaW5nIGlzOg0KDQokJHgnID0gXGZyYWN7eCAtIE1BRH17KFEzLVExKX0kJA0KDQpgYGB7ciBtYWQgc2NhbGluZ30NCkxGUV9LTy5tYWQgPC0gYXMuZGF0YS5mcmFtZShEZXNjVG9vbHM6OlJvYlNjYWxlKExGUV9LTykpICMgTm9uLUltcHV0ZWQNCkxGUV9LT19pbXAubWFkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfS09faW1wKSkgIyBJbXB1dGVkDQpMRlFfS09fUkYubWFkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfS09fUkYpKSAjIEltcHV0ZWQgUkYNCkxGUV9LT19rTk4ubWFkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfS09fa05OKSkgIyBJbXB1dGVkIGtOTg0KTEZRX0tPX2x1ZG92aWMubWFkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfS09fbHVkb3ZpYykpICMgSW1wdXRlZCBsdWRvdmljDQoNCkxGUV9XVC5tYWQgPC0gYXMuZGF0YS5mcmFtZShEZXNjVG9vbHM6OlJvYlNjYWxlKExGUV9XVCkpICMgTm9uLUltcHV0ZWQNCkxGUV9XVF9pbXAubWFkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfV1RfaW1wKSkgIyBJbXB1dGVkDQpMRlFfV1RfUkYubWFkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfV1RfUkYpKSAjIEltcHV0ZWQgUkYNCkxGUV9XVF9rTk4ubWFkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfV1Rfa05OKSkgIyBJbXB1dGVkIGtOTg0KTEZRX1dUX2x1ZG92aWMubWFkIDwtIGFzLmRhdGEuZnJhbWUoRGVzY1Rvb2xzOjpSb2JTY2FsZShMRlFfV1RfbHVkb3ZpYykpICMgSW1wdXRlZCBsdWRvdmljDQpgYGANCg0KKipTdW1tYXJ5Kio8YnI+DQpUaGUgTUFEIHNjYWxpbmcgbWV0aG9kIGJyb3VnaHQgdGhlIGRpc3RyaWJ1dGlvbnMgY2xvc2VyIHRvZ2V0aGVyLCBidXQgYWdhaW4gd2UgbG9zdA0KdGhlIG9yaWdpbmFsIHNjYWxlIG9mIHRoZSBkYXRhIGFuZCB0aGUgZGlmZmVyZW5jZXMgYXJlIGhhcmRlciB0byBzZWUgYWZ0ZXIgbm9ybWFsaXphdGlvbi4NCg0KPGNlbnRlcj48YiBzdHlsZT0nZm9udC1zaXplOjIwcHgnPkRJU1RSSUJVVElPTlM8L2I+PC9jZW50ZXI+DQoNCmBgYHtyIGRpc3QgbWFkLCBmaWcuaGVpZ2h0PTR9DQphbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgIHBsb3RoaXN0KExGUV9LTy5tYWQsIE5VTEwsIFRSVUUpICsgeGxhYignS08nKSwgDQogICAgcGxvdGhpc3QoTEZRX1dULm1hZCwgTlVMTCwgVFJVRSkgKyB4bGFiKCdXVCcpLA0KICAgIG5yb3c9MSxuY29sPTINCiAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ05vbi1JbXB1dGVkIERhdGEnLCBzaXplID0gMTYpDQopDQpgYGANCg0KYGBge3J9DQpnZ2FycmFuZ2UoDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX2ltcC5tYWQsICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX2ltcC5tYWQsICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpLA0KICAgICAgICBucm93PTEsbmNvbD0yDQogICAgICAgICksIHRvcCA9IHRleHRfZ3JvYignSW1wdXRlZCBEYXRhIC0gTWF0aSBDb2RlJywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX1JGLm1hZCwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1RfUkYubWFkLCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIFJhbmRvbSBGb3Jlc3QnLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBucm93PTIsbmNvbD0xDQopDQoNCmdnYXJyYW5nZSgNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09fa05OLm1hZCwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1Rfa05OLm1hZCwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBrTk4nLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09fbHVkb3ZpYy5tYWQsICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX2x1ZG92aWMubWFkLCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIEx1ZG92aWMnLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBucm93PTIsbmNvbD0xDQopDQpgYGANCg0KIyMgTGluZWFyIFJlZ3Jlc3Npb24NCg0KTm9ybWFsaXphdGlvbiBieSBsaW5lYXIgcmVncmVzc2lvbiB1c2luZyBhIHJlc2lkdWFsIG9mIHRoZSBsaW5lYXIgbW9kZWwgJHkgPSBheCArIGIkDQp0byBub3JtYWxpemUgdGhlIGRhdGEuIEluIG91ciBwcm9qZWN0IHdlIGhhdmUgdHdvIHZhcmlhYmxlczogaW5kZXBlbmRlbnQgYW5kIGRlcGVuZGVudC4NClRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSBpcyAqKkJhdGNoKiogYW5kIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgaXMgKipMRlEqKi4NCg0KYGBge3IgS08gbG19DQojIE5vbi1JbXB1dGVkDQpMRlFfS09fbG9uZyA8LSBMRlFfS08gfD4NCiAgICBwaXZvdF9sb25nZXIoY29scyA9IDE6MywgbmFtZXNfdG8gPSAiQmF0Y2giLCB2YWx1ZXNfdG8gPSAiTEZRVmFsdWUiKQ0KDQptb2RlbCA8LSBsbShMRlFWYWx1ZSB+IEJhdGNoLCBkYXRhPUxGUV9LT19sb25nKSAjIGNhbGN1bGF0ZSBsaW5lYXIgbW9kZWwNCkxGUV9LT19sb25nJG5vcm1hbGl6ZWQgPC0gTkEgIyBwcmVwYXJpbmcgY29sdW1uIGZvciBub3JtYWxpemVkIGRhdGENCkxGUV9LT19sb25nW3doaWNoKCFpcy5uYShMRlFfS09fbG9uZyRMRlFWYWx1ZSkpLCAnbm9ybWFsaXplZCddIDwtIHJlc2lkdWFscyhtb2RlbCkNCg0KIyByZXNoYXBlIGRhdGEgdG8gdGhlIHdpZGUgZm9ybWF0DQpMRlFfS08ubG0gPC0gTEZRX0tPX2xvbmcgfD4gDQogICAgbXV0YXRlKHJvdyA9IHJlcCgxOm5yb3coTEZRX0tPKSwgZWFjaD0zKSkgfD4NCiAgICByZXNoYXBlMjo6ZGNhc3Qocm93IH4gQmF0Y2gsIHZhbHVlLnZhcj0nbm9ybWFsaXplZCcpIHw+DQogICAgc2VsZWN0KC1yb3cpDQoNCiMgSW1wdXRlZCBNYXRpIENvZGUNCkxGUV9LT19sb25nIDwtIExGUV9LT19pbXAgfD4NCiAgICBwaXZvdF9sb25nZXIoY29scyA9IDE6MywgbmFtZXNfdG8gPSAiQmF0Y2giLCB2YWx1ZXNfdG8gPSAiTEZRVmFsdWUiKQ0KDQptb2RlbCA8LSBsbShMRlFWYWx1ZSB+IEJhdGNoLCBkYXRhPUxGUV9LT19sb25nKSAjIGNhbGN1bGF0ZSBsaW5lYXIgbW9kZWwNCkxGUV9LT19sb25nJG5vcm1hbGl6ZWQgPC0gcmVzaWR1YWxzKG1vZGVsKSAjIG5vcm1hbGl6ZWQgZGF0YQ0KDQojIHJlc2hhcGUgZGF0YSB0byB0aGUgd2lkZSBmb3JtYXQNCkxGUV9LT19pbXAubG0gPC0gTEZRX0tPX2xvbmcgfD4gDQogICAgbXV0YXRlKHJvdyA9IHJlcCgxOm5yb3coTEZRX0tPX2ltcCksIGVhY2g9MykpIHw+DQogICAgcmVzaGFwZTI6OmRjYXN0KHJvdyB+IEJhdGNoLCB2YWx1ZS52YXI9J25vcm1hbGl6ZWQnKSB8Pg0KICAgIHNlbGVjdCgtcm93KQ0KDQojIEltcHV0ZWQgUkYNCkxGUV9LT19sb25nIDwtIExGUV9LT19SRiB8Pg0KICAgIHBpdm90X2xvbmdlcihjb2xzID0gMTozLCBuYW1lc190byA9ICJCYXRjaCIsIHZhbHVlc190byA9ICJMRlFWYWx1ZSIpDQoNCm1vZGVsIDwtIGxtKExGUVZhbHVlIH4gQmF0Y2gsIGRhdGE9TEZRX0tPX2xvbmcpICMgY2FsY3VsYXRlIGxpbmVhciBtb2RlbA0KTEZRX0tPX2xvbmckbm9ybWFsaXplZCA8LSByZXNpZHVhbHMobW9kZWwpICMgbm9ybWFsaXplZCBkYXRhDQoNCiMgcmVzaGFwZSBkYXRhIHRvIHRoZSB3aWRlIGZvcm1hdA0KTEZRX0tPX1JGLmxtIDwtIExGUV9LT19sb25nIHw+IA0KICAgIG11dGF0ZShyb3cgPSByZXAoMTpucm93KExGUV9LT19SRiksIGVhY2g9MykpIHw+DQogICAgcmVzaGFwZTI6OmRjYXN0KHJvdyB+IEJhdGNoLCB2YWx1ZS52YXI9J25vcm1hbGl6ZWQnKSB8Pg0KICAgIHNlbGVjdCgtcm93KQ0KDQojIEltcHV0ZWQga05ODQpMRlFfS09fbG9uZyA8LSBMRlFfS09fa05OIHw+DQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAxOjMsIG5hbWVzX3RvID0gIkJhdGNoIiwgdmFsdWVzX3RvID0gIkxGUVZhbHVlIikNCg0KbW9kZWwgPC0gbG0oTEZRVmFsdWUgfiBCYXRjaCwgZGF0YT1MRlFfS09fbG9uZykgIyBjYWxjdWxhdGUgbGluZWFyIG1vZGVsDQpMRlFfS09fbG9uZyRub3JtYWxpemVkIDwtIHJlc2lkdWFscyhtb2RlbCkgIyBub3JtYWxpemVkIGRhdGENCg0KIyByZXNoYXBlIGRhdGEgdG8gdGhlIHdpZGUgZm9ybWF0DQpMRlFfS09fa05OLmxtIDwtIExGUV9LT19sb25nIHw+IA0KICAgIG11dGF0ZShyb3cgPSByZXAoMTpucm93KExGUV9LT19rTk4pLCBlYWNoPTMpKSB8Pg0KICAgIHJlc2hhcGUyOjpkY2FzdChyb3cgfiBCYXRjaCwgdmFsdWUudmFyPSdub3JtYWxpemVkJykgfD4NCiAgICBzZWxlY3QoLXJvdykNCg0KIyBJbXB1dGVkIGx1ZG92aWMNCkxGUV9LT19sb25nIDwtIExGUV9LT19sdWRvdmljIHw+DQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAxOjMsIG5hbWVzX3RvID0gIkJhdGNoIiwgdmFsdWVzX3RvID0gIkxGUVZhbHVlIikNCg0KbW9kZWwgPC0gbG0oTEZRVmFsdWUgfiBCYXRjaCwgZGF0YT1MRlFfS09fbG9uZykgIyBjYWxjdWxhdGUgbGluZWFyIG1vZGVsDQpMRlFfS09fbG9uZyRub3JtYWxpemVkIDwtIHJlc2lkdWFscyhtb2RlbCkgIyBub3JtYWxpemVkIGRhdGENCg0KIyByZXNoYXBlIGRhdGEgdG8gdGhlIHdpZGUgZm9ybWF0DQpMRlFfS09fbHVkb3ZpYy5sbSA8LSBMRlFfS09fbG9uZyB8PiANCiAgICBtdXRhdGUocm93ID0gcmVwKDE6bnJvdyhMRlFfS09fbHVkb3ZpYyksIGVhY2g9MykpIHw+DQogICAgcmVzaGFwZTI6OmRjYXN0KHJvdyB+IEJhdGNoLCB2YWx1ZS52YXI9J25vcm1hbGl6ZWQnKSB8Pg0KICAgIHNlbGVjdCgtcm93KQ0KYGBgDQoNCmBgYHtyIFdUIGxtfQ0KIyBOb24tSW1wdXRlZA0KTEZRX1dUX2xvbmcgPC0gTEZRX1dUIHw+DQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAxOjMsIG5hbWVzX3RvID0gIkJhdGNoIiwgdmFsdWVzX3RvID0gIkxGUVZhbHVlIikNCg0KbW9kZWwgPC0gbG0oTEZRVmFsdWUgfiBCYXRjaCwgZGF0YT1MRlFfV1RfbG9uZykgIyBjYWxjdWxhdGUgbGluZWFyIG1vZGVsDQpMRlFfV1RfbG9uZyRub3JtYWxpemVkIDwtIE5BICMgcHJlcGFyaW5nIGNvbHVtbiBmb3Igbm9ybWFsaXplZCBkYXRhDQojIG5vcm1hbGl6ZWQgZGF0YQ0KTEZRX1dUX2xvbmdbd2hpY2goIWlzLm5hKExGUV9XVF9sb25nJExGUVZhbHVlKSksICdub3JtYWxpemVkJ10gPC0gcmVzaWR1YWxzKG1vZGVsKQ0KDQojIHJlc2hhcGUgZGF0YSB0byB0aGUgd2lkZSBmb3JtYXQNCkxGUV9XVC5sbSA8LSBMRlFfV1RfbG9uZyB8PiANCiAgICBtdXRhdGUocm93ID0gcmVwKDE6bnJvdyhMRlFfV1QpLCBlYWNoPTMpKSB8Pg0KICAgIHJlc2hhcGUyOjpkY2FzdChyb3cgfiBCYXRjaCwgdmFsdWUudmFyPSdub3JtYWxpemVkJykgfD4NCiAgICBzZWxlY3QoLXJvdykNCg0KIyBJbXB1dGVkIE1hdGkgQ29kZQ0KTEZRX1dUX2xvbmcgPC0gTEZRX1dUX2ltcCB8Pg0KICAgIHBpdm90X2xvbmdlcihjb2xzID0gMTozLCBuYW1lc190byA9ICJCYXRjaCIsIHZhbHVlc190byA9ICJMRlFWYWx1ZSIpDQoNCm1vZGVsIDwtIGxtKExGUVZhbHVlIH4gQmF0Y2gsIGRhdGE9TEZRX1dUX2xvbmcpICMgY2FsY3VsYXRlIGxpbmVhciBtb2RlbA0KTEZRX1dUX2xvbmckbm9ybWFsaXplZCA8LSByZXNpZHVhbHMobW9kZWwpICMgbm9ybWFsaXplZCBkYXRhDQoNCiMgcmVzaGFwZSBkYXRhIHRvIHRoZSB3aWRlIGZvcm1hdA0KTEZRX1dUX2ltcC5sbSA8LSBMRlFfV1RfbG9uZyB8PiANCiAgICBtdXRhdGUocm93ID0gcmVwKDE6bnJvdyhMRlFfV1RfaW1wKSwgZWFjaD0zKSkgfD4NCiAgICByZXNoYXBlMjo6ZGNhc3Qocm93IH4gQmF0Y2gsIHZhbHVlLnZhcj0nbm9ybWFsaXplZCcpIHw+DQogICAgc2VsZWN0KC1yb3cpDQoNCiMgSW1wdXRlZCBSRg0KTEZRX1dUX2xvbmcgPC0gTEZRX1dUX1JGIHw+DQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAxOjMsIG5hbWVzX3RvID0gIkJhdGNoIiwgdmFsdWVzX3RvID0gIkxGUVZhbHVlIikNCg0KbW9kZWwgPC0gbG0oTEZRVmFsdWUgfiBCYXRjaCwgZGF0YT1MRlFfV1RfbG9uZykgIyBjYWxjdWxhdGUgbGluZWFyIG1vZGVsDQpMRlFfV1RfbG9uZyRub3JtYWxpemVkIDwtIHJlc2lkdWFscyhtb2RlbCkgIyBub3JtYWxpemVkIGRhdGENCg0KIyByZXNoYXBlIGRhdGEgdG8gdGhlIHdpZGUgZm9ybWF0DQpMRlFfV1RfUkYubG0gPC0gTEZRX1dUX2xvbmcgfD4gDQogICAgbXV0YXRlKHJvdyA9IHJlcCgxOm5yb3coTEZRX1dUX1JGKSwgZWFjaD0zKSkgfD4NCiAgICByZXNoYXBlMjo6ZGNhc3Qocm93IH4gQmF0Y2gsIHZhbHVlLnZhcj0nbm9ybWFsaXplZCcpIHw+DQogICAgc2VsZWN0KC1yb3cpDQoNCiMgSW1wdXRlZCBrTk4NCkxGUV9XVF9sb25nIDwtIExGUV9XVF9rTk4gfD4NCiAgICBwaXZvdF9sb25nZXIoY29scyA9IDE6MywgbmFtZXNfdG8gPSAiQmF0Y2giLCB2YWx1ZXNfdG8gPSAiTEZRVmFsdWUiKQ0KDQptb2RlbCA8LSBsbShMRlFWYWx1ZSB+IEJhdGNoLCBkYXRhPUxGUV9XVF9sb25nKSAjIGNhbGN1bGF0ZSBsaW5lYXIgbW9kZWwNCkxGUV9XVF9sb25nJG5vcm1hbGl6ZWQgPC0gcmVzaWR1YWxzKG1vZGVsKSAjIG5vcm1hbGl6ZWQgZGF0YQ0KDQojIHJlc2hhcGUgZGF0YSB0byB0aGUgd2lkZSBmb3JtYXQNCkxGUV9XVF9rTk4ubG0gPC0gTEZRX1dUX2xvbmcgfD4gDQogICAgbXV0YXRlKHJvdyA9IHJlcCgxOm5yb3coTEZRX1dUX2tOTiksIGVhY2g9MykpIHw+DQogICAgcmVzaGFwZTI6OmRjYXN0KHJvdyB+IEJhdGNoLCB2YWx1ZS52YXI9J25vcm1hbGl6ZWQnKSB8Pg0KICAgIHNlbGVjdCgtcm93KQ0KDQojIEltcHV0ZWQgbHVkb3ZpYw0KTEZRX1dUX2xvbmcgPC0gTEZRX1dUX2x1ZG92aWMgfD4NCiAgICBwaXZvdF9sb25nZXIoY29scyA9IDE6MywgbmFtZXNfdG8gPSAiQmF0Y2giLCB2YWx1ZXNfdG8gPSAiTEZRVmFsdWUiKQ0KDQptb2RlbCA8LSBsbShMRlFWYWx1ZSB+IEJhdGNoLCBkYXRhPUxGUV9XVF9sb25nKSAjIGNhbGN1bGF0ZSBsaW5lYXIgbW9kZWwNCkxGUV9XVF9sb25nJG5vcm1hbGl6ZWQgPC0gcmVzaWR1YWxzKG1vZGVsKSAjIG5vcm1hbGl6ZWQgZGF0YQ0KDQojIHJlc2hhcGUgZGF0YSB0byB0aGUgd2lkZSBmb3JtYXQNCkxGUV9XVF9sdWRvdmljLmxtIDwtIExGUV9XVF9sb25nIHw+IA0KICAgIG11dGF0ZShyb3cgPSByZXAoMTpucm93KExGUV9XVF9sdWRvdmljKSwgZWFjaD0zKSkgfD4NCiAgICByZXNoYXBlMjo6ZGNhc3Qocm93IH4gQmF0Y2gsIHZhbHVlLnZhcj0nbm9ybWFsaXplZCcpIHw+DQogICAgc2VsZWN0KC1yb3cpDQpgYGANCg0KKipTdW1tYXJ5Kio8YnI+DQpUaGUgbGluZWFyIHJlZ3Jlc3Npb24gbWV0aG9kIGJyb3VnaHQgdGhlIGRpc3RyaWJ1dGlvbnMgY2xvc2VyIHRvZ2V0aGVyLCBidXQgYWdhaW4gd2UgbG9zdA0KdGhlIG9yaWdpbmFsIHNjYWxlIG9mIHRoZSBkYXRhIGFuZCB0aGUgZGlmZmVyZW5jZXMgYXJlIGhhcmRlciB0byBzZWUgYWZ0ZXIgbm9ybWFsaXphdGlvbi4NCg0KPGNlbnRlcj48YiBzdHlsZT0nZm9udC1zaXplOjIwcHgnPkRJU1RSSUJVVElPTlM8L2I+PC9jZW50ZXI+DQoNCmBgYHtyIGRpc3QgbG0sIGZpZy5oZWlnaHQ9NH0NCmFubm90YXRlX2ZpZ3VyZShnZ2FycmFuZ2UoDQogICAgcGxvdGhpc3QoTEZRX0tPLmxtLCBOVUxMLCBUUlVFKSArIHhsYWIoJ0tPJyksIA0KICAgIHBsb3RoaXN0KExGUV9XVC5sbSwgTlVMTCwgVFJVRSkgKyB4bGFiKCdXVCcpLA0KICAgIG5yb3c9MSxuY29sPTINCiAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ05vbi1JbXB1dGVkIERhdGEnLCBzaXplID0gMTYpDQopDQpgYGANCg0KYGBge3J9DQpnZ2FycmFuZ2UoDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX2ltcC5sbSwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1RfaW1wLmxtLCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIE1hdGkgQ29kZScsIHNpemUgPSAxNikNCiAgICApLA0KICAgIGFubm90YXRlX2ZpZ3VyZShnZ2FycmFuZ2UoDQogICAgICAgIHBsb3RoaXN0KExGUV9LT19SRi5sbSwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1RfUkYubG0sICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpLA0KICAgICAgICBucm93PTEsbmNvbD0yDQogICAgICAgICksIHRvcCA9IHRleHRfZ3JvYignSW1wdXRlZCBEYXRhIC0gUmFuZG9tIEZvcmVzdCcsIHNpemUgPSAxNikNCiAgICApLA0KICAgIG5yb3c9MixuY29sPTENCikNCg0KZ2dhcnJhbmdlKA0KICAgIGFubm90YXRlX2ZpZ3VyZShnZ2FycmFuZ2UoDQogICAgICAgIHBsb3RoaXN0KExGUV9LT19rTk4ubG0sICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX2tOTi5sbSwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBrTk4nLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09fbHVkb3ZpYy5sbSwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1RfbHVkb3ZpYy5sbSwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBMdWRvdmljJywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgbnJvdz0yLG5jb2w9MQ0KKQ0KYGBgDQoNCiMjIFZTTg0KDQoqKlZTTioqIC0gKipWKiphcmlhbmNlICoqUyoqdGFiaWxpemF0aW9uICoqTioqb3JtYWxpemF0aW9uDQoNClRoZSBkYXRhIGFyZSByZXR1cm5lZCBvbiBhICRnbG9nJCBzY2FsZSB0byBiYXNlIDIuIE1vcmUgcHJlY2lzZWx5LCB0aGUgdHJhbnNmb3JtZWQgDQpkYXRhIGFyZSBzdWJqZWN0IHRvIHRoZSB0cmFuc2Zvcm1hdGlvbiAkZ2xvZ18yKGYoYikqeCthKStjJCwgd2hlcmUgdGhlIGZ1bmN0aW9uDQokZ2xvZ18yKHUpPWxvZ18yKHUrXHNxcnR7dSp1KzF9KSA9IGFzaW5oKHUpL2xvZygyKSQgaXMgY2FsbGVkIHRoZSBnZW5lcmFsaXNlZCBsb2dhcml0aG0sIA0KdGhlIG9mZnNldCAkYSQgYW5kIHRoZSBzY2FsaW5nIHBhcmFtZXRlciAkYiQgYXJlIHRoZSBmaXR0ZWQgbW9kZWwgcGFyYW1ldGVycyAoc2VlIHJlZmVyZW5jZXMpLCANCmFuZCAkZih4KT1leHAoeCkkIGlzIGEmbmJzcDtwYXJhbWV0ZXIgdHJhbnNmb3JtYXRpb24gdGhhdCBhbGxvd3MgZW5zdXJpbmcgcG9zaXRpdml0eSBvZiANCnRoZSBmYWN0b3IgaW4gZnJvbnQgb2YgeCB3aGlsZSB1c2luZyBhbiB1bmNvbnN0cmFpbmVkIG9wdGltaXphdGlvbiBvdmVyICRiJCZuYnNwO1tbc291cmNlXShodHRwczovL3d3dy5iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL2RldmVsL2Jpb2MvdmlnbmV0dGVzL3Zzbi9pbnN0L2RvYy9DLWxpa2VsaWhvb2Rjb21wdXRhdGlvbnMucGRmKV0uIA0KVGhlIG92ZXJhbGwgb2Zmc2V0ICRjJCBpcyBjb21wdXRlZCBmcm9tIHRoZSAkYiQncyBzdWNoIHRoYXQgZm9yIGxhcmdlICR4JCB0aGUgDQp0cmFuc2Zvcm1hdGlvbiBhcHByb3hpbWF0ZWx5IGNvcnJlc3BvbmRzIHRvIHRoZSAkbG9nXzIkIGZ1bmN0aW9uLiBUaGlzIGlzIGRvbmUgDQpzZXBhcmF0ZWx5IGZvciBlYWNoIHN0cmF0dW0sIGJ1dCB3aXRoIHRoZSBzYW1lIHZhbHVlIGFjcm9zcyBhcnJheXMuIE1vcmUgcHJlY2lzZWx5LCANCmlmIHRoZSBlbGVtZW50ICRiW3MsaV0kIG9mIHRoZSBhcnJheSAkYiQgaXMgdGhlIHNjYWxpbmcgcGFyYW1ldGVyIGZvciB0aGUgJHMkLXRoIHN0cmF0dW0NCmFuZCB0aGUgJGkkLXRoIGFycmF5LCB0aGVuICRjW3NdJCBpcyBjb21wdXRlZCBhcyAkbG9nMigyKmYobWVhbihiWyxpXSkpKSQuIFRoZSZuYnNwO29mZnNldA0KJGMkIGlzICBpbmNvbnNlcXVlbnRpYWwgZm9yIGFsbCBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBjYWxjdWxhdGlvbnMsIGJ1dCANCm1hbnkgdXNlcnMgbGlrZSB0byBzZWUgdGhlIGRhdGEgaW4gYSByYW5nZSB0aGF0IHRoZXkgYXJlIGZhbWlsaWFyIHdpdGguDQoNCmBgYHtyIHZzbn0NCiMgUHJlcGFyaW5nIGlucHV0IGludG8gVlNOIGZ4bg0KbGZxX3JnbGlzdDwtIG5ldygnUkdMaXN0JywgbGlzdCgNCiAgICBSID0gYXMubWF0cml4KDJeTEZRX0tPKSwgICAjIGNvbmRpdGlvbg0KICAgIEcgPSBhcy5tYXRyaXgoMl5MRlFfV1QpKSkgICMgY29udHJvbA0KDQojIFByZXBhcmluZyBpbnB1dCBpbnRvIFZTTiBmeG4NCmxmcV9yZ2xpc3RfaW1wPC0gbmV3KCdSR0xpc3QnLCBsaXN0KA0KICAgIFIgPSBhcy5tYXRyaXgoMl5MRlFfS09faW1wKSwgICAjIGNvbmRpdGlvbg0KICAgIEcgPSBhcy5tYXRyaXgoMl5MRlFfV1RfaW1wKSkpICAjIGNvbnRyb2wNCg0KIyBQcmVwYXJpbmcgaW5wdXQgaW50byBWU04gZnhuDQpsZnFfcmdsaXN0X1JGPC0gbmV3KCdSR0xpc3QnLCBsaXN0KA0KICAgIFIgPSBhcy5tYXRyaXgoMl5MRlFfS09fUkYpLCAgICMgY29uZGl0aW9uDQogICAgRyA9IGFzLm1hdHJpeCgyXkxGUV9XVF9SRikpKSAgIyBjb250cm9sDQoNCiMgUHJlcGFyaW5nIGlucHV0IGludG8gVlNOIGZ4bg0KbGZxX3JnbGlzdF9rTk48LSBuZXcoJ1JHTGlzdCcsIGxpc3QoDQogICAgUiA9IGFzLm1hdHJpeCgyXkxGUV9LT19rTk4pLCAgICMgY29uZGl0aW9uDQogICAgRyA9IGFzLm1hdHJpeCgyXkxGUV9XVF9rTk4pKSkgICMgY29udHJvbA0KDQojIFByZXBhcmluZyBpbnB1dCBpbnRvIFZTTiBmeG4NCmxmcV9yZ2xpc3RfbHVkb3ZpYyA8LSBuZXcoJ1JHTGlzdCcsIGxpc3QoDQogICAgUiA9IGFzLm1hdHJpeCgyXkxGUV9LT19sdWRvdmljKSwgICAjIGNvbmRpdGlvbg0KICAgIEcgPSBhcy5tYXRyaXgoMl5MRlFfV1RfbHVkb3ZpYykpKSAgIyBjb250cm9sDQoNCkxGUV9LTy52c24gPC0ganVzdHZzbihsZnFfcmdsaXN0KUBhc3NheURhdGEkUiAgIyBOb24tSW1wdXRlZA0KTEZRX0tPX2ltcC52c24gPC0ganVzdHZzbihsZnFfcmdsaXN0X2ltcClAYXNzYXlEYXRhJFIgIyBJbXB1dGVkDQpMRlFfS09fUkYudnNuIDwtIGp1c3R2c24obGZxX3JnbGlzdF9SRilAYXNzYXlEYXRhJFIgIyBJbXB1dGVkIFJGDQpMRlFfS09fa05OLnZzbiA8LSBqdXN0dnNuKGxmcV9yZ2xpc3Rfa05OKUBhc3NheURhdGEkUiAjIEltcHV0ZWQga05ODQpMRlFfS09fbHVkb3ZpYy52c24gPC0ganVzdHZzbihsZnFfcmdsaXN0X2x1ZG92aWMpQGFzc2F5RGF0YSRSICMgSW1wdXRlZCBsdWRvdmljDQoNCkxGUV9XVC52c24gPC0ganVzdHZzbihsZnFfcmdsaXN0KUBhc3NheURhdGEkRyAgIyBOb24tSW1wdXRlZA0KTEZRX1dUX2ltcC52c24gPC0ganVzdHZzbihsZnFfcmdsaXN0X2ltcClAYXNzYXlEYXRhJEcgIyBJbXB1dGVkDQpMRlFfV1RfUkYudnNuIDwtIGp1c3R2c24obGZxX3JnbGlzdF9SRilAYXNzYXlEYXRhJEcgIyBJbXB1dGVkIFJGDQpMRlFfV1Rfa05OLnZzbiA8LSBqdXN0dnNuKGxmcV9yZ2xpc3Rfa05OKUBhc3NheURhdGEkRyAjIEltcHV0ZWQga05ODQpMRlFfV1RfbHVkb3ZpYy52c24gPC0ganVzdHZzbihsZnFfcmdsaXN0X2x1ZG92aWMpQGFzc2F5RGF0YSRHICMgSW1wdXRlZCBsdWRvdmljDQpgYGANCg0KKipTdW1tYXJ5Kio8YnI+DQpUaGUgVlNOIG1ldGhvZCBicm91Z2h0IHRoZSBkaXN0cmlidXRpb25zIGNsb3NlciB0b2dldGhlciBhbmQgd2UgZGlkbid0IGxvc2UgdGhlIA0Kb3JpZ2luYWwgc2NhbGUgb2YgdGhlIGRhdGEuIFRoZSBtZXRob2QgZGlkbid0IGxvc2UgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gDQpLTyBhbmQgV1QgY2VsbHMgYXQgZmlyc3QgZ2xhbmNlLiBJbiBhZGRpdGlvbiwgdGhlIDI0dGggcmVwbGljYXRlIG9mIEtPIGNlbGwgZG9lc24ndA0Kc3RhbmQgb3V0IG9ubHkgaW4gZGlzdHJpYnV0aW9uIG9mIGltcHV0ZWQgZGF0YSB3aXRoIGtOTi4NCg0KPGNlbnRlcj48YiBzdHlsZT0nZm9udC1zaXplOjIwcHgnPkRJU1RSSUJVVElPTlM8L2I+PC9jZW50ZXI+DQoNCmBgYHtyIGRpc3QgdnNuLCBmaWcuaGVpZ2h0PTR9DQphbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgIHBsb3RoaXN0KExGUV9LTy52c24sIE5VTEwsIFRSVUUpICsgeGxhYignS08nKSwgDQogICAgcGxvdGhpc3QoTEZRX1dULnZzbiwgTlVMTCwgVFJVRSkgKyB4bGFiKCdXVCcpLA0KICAgIG5yb3c9MSxuY29sPTINCiAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ05vbi1JbXB1dGVkIERhdGEnLCBzaXplID0gMTYpDQopDQpgYGANCg0KYGBge3J9DQpnZ2FycmFuZ2UoDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX2ltcC52c24sICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX2ltcC52c24sICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpLA0KICAgICAgICBucm93PTEsbmNvbD0yDQogICAgICAgICksIHRvcCA9IHRleHRfZ3JvYignSW1wdXRlZCBEYXRhIC0gTWF0aSBDb2RlJywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX1JGLnZzbiwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1RfUkYudnNuLCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIFJhbmRvbSBGb3Jlc3QnLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBucm93PTIsbmNvbD0xDQopDQoNCmdnYXJyYW5nZSgNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09fa05OLnZzbiwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1Rfa05OLnZzbiwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBrTk4nLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09fbHVkb3ZpYy52c24sICcnLCBGQUxTRSkgKyB4bGFiKCdLTycpLCANCiAgICAgICAgcGxvdGhpc3QoTEZRX1dUX2x1ZG92aWMudnNuLCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIEx1ZG92aWMnLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBucm93PTIsbmNvbD0xDQopDQpgYGANCg0KIyMgRWlnZW5NUw0KDQoqKkVpZ2VuTVMqKiBpcyBhIG5vcm1hbGl6YXRpb24gbWV0aG9kIGRldmVsb3BlZCBmb3IgaGlnaC10aHJvdWdocHV0IG1hc3Mgc3BlY3Ryb21ldHJ5IA0KKE1TKSBwcm90ZW9taWNzIGRhdGEuIEl0IHVzZXMgZWlnZW52ZWN0b3ItYmFzZWQgYWRqdXN0bWVudHMgdG8gcmVtb3ZlIHVud2FudGVkIA0KdmFyaWF0aW9uLCBzdWNoIGFzIGJhdGNoIGVmZmVjdHMsIGZyb20gdGhlIGRhdGEuIFRoZSBtZXRob2Qgd29ya3MgYnkgaWRlbnRpZnlpbmcgDQpzeXN0ZW1hdGljIGJpYXNlcyBpbiB0aGUgZGF0YXNldCBhbmQgYXBwbHlpbmcgYSBjb3JyZWN0aW9uIHdoaWxlIHByZXNlcnZpbmcgDQpiaW9sb2dpY2FsbHkgcmVsZXZhbnQgc2lnbmFscy4NCg0KSW4gdGhlIEVpZ2VuTVMgbWV0aG9kLCBlaWdlbnRyZW5kcyBhcmUgY2FsY3VsYXRlZCBieSBkZWNvbXBvc2luZyB0aGUgc3lzdGVtYXRpYyANCnZhcmlhdGlvbiBpbiB0aGUgcHJvdGVvbWljcyBkYXRhIG1hdHJpeCB1c2luZyBTaW5ndWxhciBWYWx1ZSBEZWNvbXBvc2l0aW9uIChTVkQpLiANClRoaXMgaXMgdHlwaWNhbGx5IGV4cHJlc3NlZCBhczoNCg0KJCRYID0gVSBcU2lnbWEgVickJA0KV2hlcmU6DQoNCiogJFgkIHJlcHJlc2VudHMgdGhlIG9yaWdpbmFsIGRhdGEgbWF0cml4Lg0KKiAkVSQgYW5kICR2JyQgYXJlIG9ydGhvZ29uYWwgbWF0cmljZXMuDQoqICRcU2lnbWEkIGlzIGEgZGlhZ29uYWwgbWF0cml4IG9mIHNpbmd1bGFyIHZhbHVlcy4NCg0KVGhlIGRlY29tcG9zaXRpb24gaXNvbGF0ZXMgc3lzdGVtYXRpYyB0cmVuZHMgKGVpZ2VudHJlbmRzKSBhcyBjb2x1bW5zIGluICRVJCwgDQp3aGljaCBjYW4gdGhlbiBiZSByZW1vdmVkIHRvIGFkanVzdCBmb3IgdW53YW50ZWQgdmFyaWF0aW9uLg0KDQpgYGB7ciBFaWdlbk1TLCBmaWcua2VlcD0nbm9uZScsIHJlc3VsdHM9J2hpZGUnfQ0KIyBhIHZlY3RvciBvZiB0cmVhdG1lbnRzIGluIHRoZSBvcmRlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb2x1bW5zIGluIHRoZSBkYXRhIGZyYW1lDQp0cmVhdG1lbnQgPSBhcy5mYWN0b3IoYygnS08nLCAnS08nLCAnS08nLCAnV1QnLCAnV1QnLCAnV1QnKSkNCg0KIyBOb24tSW1wdXRlZA0KcHJvdC5pbmZvIDwtIGRhdGEuZnJhbWUocHJvdF9JRCA9IHBhc3RlKCdwcm90XycsIDE6bnJvdyhsZnEpLCBzZXAgPSAnJykpICMgYWRkIGluZm8gYWJvdXQgTEZRIHZhbHVlDQpMRlEuZWlnMSA8LSBlaWdfbm9ybTEobGZxLCANCiAgICAgICAgICAgICAgICAgICAgICB0cmVhdG1lbnQgPSB0cmVhdG1lbnQsIA0KICAgICAgICAgICAgICAgICAgICAgIHByb3QuaW5mbyA9IHByb3QuaW5mbykNCiMgUGVyZm9ybWluZyBlaWcgbm9ybWFsaXphdGlvbg0KTEZRLmVpZ19ub3JtIDwtIGVpZ19ub3JtMihMRlEuZWlnMSkNCg0KIyBJbXB1dGVkDQpwcm90LmluZm8gPC0gZGF0YS5mcmFtZShwcm90X0lEID0gcGFzdGUoJ3Byb3RfJywgMTpucm93KGxmcV9pbXApLCBzZXAgPSAnJykpICMgYWRkIGluZm8gYWJvdXQgTEZRIHZhbHVlDQpMRlFfaW1wLmVpZzEgPC0gZWlnX25vcm0xKGxmcV9pbXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVhdG1lbnQgPSB0cmVhdG1lbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90LmluZm8gPSBwcm90LmluZm8pDQojIFBlcmZvcm1pbmcgZWlnIG5vcm1hbGl6YXRpb24NCkxGUV9pbXAuZWlnX25vcm0gPC0gZWlnX25vcm0yKExGUV9pbXAuZWlnMSkNCg0KIyBJbXB1dGVkIFJGDQpwcm90LmluZm8gPC0gZGF0YS5mcmFtZShwcm90X0lEID0gcGFzdGUoJ3Byb3RfJywgMTpucm93KGltcHV0ZWRfUkYpLCBzZXAgPSAnJykpICMgYWRkIGluZm8gYWJvdXQgTEZRIHZhbHVlDQpMRlFfUkYuZWlnMSA8LSBlaWdfbm9ybTEoaW1wdXRlZF9SRiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgdHJlYXRtZW50ID0gdHJlYXRtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm90LmluZm8gPSBwcm90LmluZm8pDQojIFBlcmZvcm1pbmcgZWlnIG5vcm1hbGl6YXRpb24NCkxGUV9SRi5laWdfbm9ybSA8LSBlaWdfbm9ybTIoTEZRX1JGLmVpZzEpDQoNCiMgSW1wdXRlZCBrTk4NCnByb3QuaW5mbyA8LSBkYXRhLmZyYW1lKHByb3RfSUQgPSBwYXN0ZSgncHJvdF8nLCAxOm5yb3coaW1wdXRlZF9rTk4pLCBzZXAgPSAnJykpICMgYWRkIGluZm8gYWJvdXQgTEZRIHZhbHVlDQpMRlFfa05OLmVpZzEgPC0gZWlnX25vcm0xKGltcHV0ZWRfa05OLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlYXRtZW50ID0gdHJlYXRtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5pbmZvID0gcHJvdC5pbmZvKQ0KIyBQZXJmb3JtaW5nIGVpZyBub3JtYWxpemF0aW9uDQpMRlFfa05OLmVpZ19ub3JtIDwtIGVpZ19ub3JtMihMRlFfa05OLmVpZzEpDQoNCiMgSW1wdXRlZCBsdWRvdmljDQpwcm90LmluZm8gPC0gZGF0YS5mcmFtZShpbXB1dGVkX2x1ZG92aWMkYFByb3RlaW4gSURzYCkgIyBhZGQgaW5mbyBhYm91dCBMRlEgdmFsdWUNCkxGUV9sdWRvdmljLmVpZzEgPC0gZWlnX25vcm0xKGltcHV0ZWRfbHVkb3ZpY1ssLWMoMSwyKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVhdG1lbnQgPSB0cmVhdG1lbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90LmluZm8gPSBwcm90LmluZm8pDQojIFBlcmZvcm1pbmcgZWlnIG5vcm1hbGl6YXRpb24NCkxGUV9sdWRvdmljLmVpZ19ub3JtIDwtIGVpZ19ub3JtMihMRlFfbHVkb3ZpYy5laWcxKQ0KYGBgDQoNCmBgYHtyIEtPIGFuZCBXVCBlaWdlbn0NCkxGUV9LTy5laWdlbiA8LSBMRlEuZWlnX25vcm0kbm9ybV9tWywxOjNdICMgTm9uLUltcHV0ZWQNCkxGUV9LT19pbXAuZWlnZW4gPC0gTEZRX2ltcC5laWdfbm9ybSRub3JtX21bLDE6M10gIyBJbXB1dGVkIE1hdGkgQ29kZQ0KTEZRX0tPX1JGLmVpZ2VuIDwtIExGUV9SRi5laWdfbm9ybSRub3JtX21bLDE6M10gIyBJbXB1dGVkIFJGDQpMRlFfS09fa05OLmVpZ2VuIDwtIExGUV9rTk4uZWlnX25vcm0kbm9ybV9tWywxOjNdICMgSW1wdXRlZCBrTk4NCkxGUV9LT19sdWRvdmljLmVpZ2VuIDwtIExGUV9sdWRvdmljLmVpZ19ub3JtJG5vcm1fbVssMTozXSAjIEltcHV0ZWQgbHVkb3ZpYw0KDQpMRlFfV1QuZWlnZW4gPC0gTEZRLmVpZ19ub3JtJG5vcm1fbVssNDo2XSAjIE5vbi1JbXB1dGVkDQpMRlFfV1RfaW1wLmVpZ2VuIDwtIExGUV9pbXAuZWlnX25vcm0kbm9ybV9tWyw0OjZdICMgSW1wdXRlZCBNYXRpIENvZGUNCkxGUV9XVF9SRi5laWdlbiA8LSBMRlFfUkYuZWlnX25vcm0kbm9ybV9tWyw0OjZdICMgSW1wdXRlZCBSRg0KTEZRX1dUX2tOTi5laWdlbiA8LSBMRlFfa05OLmVpZ19ub3JtJG5vcm1fbVssNDo2XSAjIEltcHV0ZWQga05ODQpMRlFfV1RfbHVkb3ZpYy5laWdlbiA8LSBMRlFfbHVkb3ZpYy5laWdfbm9ybSRub3JtX21bLDQ6Nl0gIyBJbXB1dGVkIGx1ZG92aWMNCmBgYA0KDQoqKlN1bW1hcnkqKjxicj4NClRoZSBFaWdlbk1TIG1ldGhvZCB3YXMgdGhlIG9uZSB3aGljaCBrZXB0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSByZXBsaWNhdGVzIA0KYW5kIGNlbGwgdHlwZXMgKEtPIGFuZCBXVCkuIFRoZSBkaXN0cmlidXRpb24gYXJlIGNsb3NlIHRvZ2V0aGVyIGFuZCB3ZSBzb2x2ZSB0aGUgDQpwcm9ibGVtIG9mIDI0dGggcmVwbGljYXRlLiBJbiBteSBvcGluaW9uIHRoZSBFaWdlbk1TIG1ldGhvZCBnaXZlcyB0aGUgYmVzdCByZXN1bHRzLg0KDQo8Y2VudGVyPjxiIHN0eWxlPSdmb250LXNpemU6MjBweCc+RElTVFJJQlVUSU9OUzwvYj48L2NlbnRlcj4NCg0KYGBge3IgZGlzdCBlaWdlbiwgZmlnLmhlaWdodD00fQ0KYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICBwbG90aGlzdChMRlFfS08uZWlnZW4sIE5VTEwsIFRSVUUpICsgeGxhYignS08nKSwgDQogICAgcGxvdGhpc3QoTEZRX1dULmVpZ2VuLCBOVUxMLCBUUlVFKSArIHhsYWIoJ1dUJyksDQogICAgbnJvdz0xLG5jb2w9Mg0KICAgICksIHRvcCA9IHRleHRfZ3JvYignTm9uLUltcHV0ZWQgRGF0YScsIHNpemUgPSAxNikNCikNCmBgYA0KDQpgYGB7cn0NCmdnYXJyYW5nZSgNCiAgICBhbm5vdGF0ZV9maWd1cmUoZ2dhcnJhbmdlKA0KICAgICAgICBwbG90aGlzdChMRlFfS09faW1wLmVpZ2VuLCAnJywgRkFMU0UpICsgeGxhYignS08nKSwgDQogICAgICAgIHBsb3RoaXN0KExGUV9XVF9pbXAuZWlnZW4sICcnLCBGQUxTRSkgKyB4bGFiKCdXVCcpLA0KICAgICAgICBucm93PTEsbmNvbD0yDQogICAgICAgICksIHRvcCA9IHRleHRfZ3JvYignSW1wdXRlZCBEYXRhIC0gTWF0aSBDb2RlJywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX1JGLmVpZ2VuLCAnJywgRkFMU0UpICsgeGxhYignS08nKSwgDQogICAgICAgIHBsb3RoaXN0KExGUV9XVF9SRi5laWdlbiwgJycsIEZBTFNFKSArIHhsYWIoJ1dUJyksDQogICAgICAgIG5yb3c9MSxuY29sPTINCiAgICAgICAgKSwgdG9wID0gdGV4dF9ncm9iKCdJbXB1dGVkIERhdGEgLSBSYW5kb20gRm9yZXN0Jywgc2l6ZSA9IDE2KQ0KICAgICksDQogICAgbnJvdz0yLG5jb2w9MQ0KKQ0KDQpnZ2FycmFuZ2UoDQogICAgYW5ub3RhdGVfZmlndXJlKGdnYXJyYW5nZSgNCiAgICAgICAgcGxvdGhpc3QoTEZRX0tPX2tOTi5laWdlbiwgJycsIEZBTFNFKSArIHhsYWIoJ0tPJyksIA0KICAgICAgICBwbG90aGlzdChMRlFfV1Rfa05OLmVpZ2VuLCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIGtOTicsIHNpemUgPSAxNikNCiAgICApLA0KICAgIGFubm90YXRlX2ZpZ3VyZShnZ2FycmFuZ2UoDQogICAgICAgIHBsb3RoaXN0KExGUV9LT19sdWRvdmljLmVpZ2VuLCAnJywgRkFMU0UpICsgeGxhYignS08nKSwgDQogICAgICAgIHBsb3RoaXN0KExGUV9XVF9sdWRvdmljLmVpZ2VuLCAnJywgRkFMU0UpICsgeGxhYignV1QnKSwNCiAgICAgICAgbnJvdz0xLG5jb2w9Mg0KICAgICAgICApLCB0b3AgPSB0ZXh0X2dyb2IoJ0ltcHV0ZWQgRGF0YSAtIEx1ZG92aWMnLCBzaXplID0gMTYpDQogICAgKSwNCiAgICBucm93PTIsbmNvbD0xDQopDQpgYGANCg0KIyBTdGF0aXN0aWNzIE1ldHJpY3Mgey50YWJzZXR9DQoNCiMjIENWIHsudGFic2V0fQ0KDQoqKkNPRUZGSUNJRU5UIE9GIFZBUklBVElPTiAoQ1YpIC8gUkVMQVRJVkUgU1RBTkRBUkQgREVWSUFUSU9OIChSU0QpKioNCg0KVGhpcyBpcyBhIHdheSB0byBtZWFzdXJlIGhvdyBzcHJlYWQgb3V0IHZhbHVlcyBhcmUgaW4gYSBkYXRhc2V0IHJlbGF0aXZlIHRvIHRoZSBtZWFuLg0KQSBsb3dlciBSU0QvQ1YgaW5kaWNhdGVzIGJldHRlciBub3JtYWxpemF0aW9uLiBJdCBpcyBjYWxjdWxhdGVkIGFzOg0KDQokQ1YgPSBcZnJhY3tcc2lnbWF9e1xtdX0kDQoNCndoZXJlOg0KDQoqICRcc2lnbWEkOiBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGRhdGFzZXQNCiogJFxtdSQ6IFRoZSBtZWFuIG9mIGRhdGFzZXQNCg0KYGBge3IgQ1Z9DQojIGZ4biB0byBjYWxjdWxhdGUgdGhlIENWIGNvZWZmaWNpZW50DQpjdiA8LSBmdW5jdGlvbiAoeCkgc2QoeCkgLyBtZWFuKHgpICogMTAwDQpgYGANCg0KKipTdW1tYXJ5KioNCkZvciB0aGUgYmlvbG9naWNhbCBkYXRhIHRoZSBjdXQtb2ZmIGxldmVsIG9mIENWIGlzIGFyb3VuZCAyMCAoKy8tNSkuIEFmdGVyIGNsb3NlIA0KbG9va2luZyBhdCB0aGUgdGFibGVzIGluIHRoZSBgKipTdW1tYXJ5KipgIHNlY3Rpb24sIHdlIGNhbiBzYWZlbHkgc2F5IHRoYXQgdGhlICoqRWlnZW5NUyoqIA0KbWV0aG9kIGhhZCB0aGUgQ1YgYXJvdW5kIDIwIGluIGFsbCBpbXB1dGF0aW9uIG1ldGhvZHMuIEluIGZhY3QsIGZyb20gdGhpcyBwb2ludCBvZiB2aWV3IA0Kd2UgY2FuIGRpc3Rpbmd1aXNoIGZvdXIgc3VjaCBtZXRob2RzIHRoYXQgaGFkIGdvb2QgY29lZmZpY2llbnQgb2YgdmFyaWF0aW9uLg0KDQoxLiBFaWdlbk1TDQoyLiBNQUQgU2NhbGluZw0KMy4gTWluLU1heCBOb3JtYWxpemF0aW9uDQo0LiBaLVNjb3JlIE5vcm1hbGl6YXRpb24NCg0KV2hlbiB3ZSB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIHZpb2xpbiBwbG90cywgd2UgY2FuIHNlZSB0aGUgc3RyYW5nZSBwYXR0ZXJuDQppbiB0aGUgcmVzdWx0cyBmb3IgdGhlICoqa05OKiogaW1wdXRhdGlvbiBtZXRob2QuIE5hbWVseSwgbWFueSB2YWx1ZXMgaGF2ZSBhIENWDQpjbG9zZSB0byB0aGUgMCwgd2hpY2ggY2FuIG1lYW4gdGhhdCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSB2YWx1ZXMgaXMgYWxzbyBjbG9zZQ0KdG8gdGhlIDAsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHZhbHVlcyBhcmUgdmVyeSBzaW1pbGFyLCB3aGljaCBzaG91bGRuJ3QgYmUgdGhlIGNhc2UuDQoNClRoZSB2aW9saW4gcGxvdHMgZm9yIHRoZSBvdGhlciBtZXRob2RzIGxvb2sgYmV0dGVyIGFuZCBzaG93IHRoZSBkaXN0cmlidXRpb24vZGVuc2l0eQ0Kb2YgdGhlIENWIGNvcnJlY3RseS4NCg0KIyMjIE5vbi1JbXB1dGVkDQoNCmBgYHtyIENWMX0NCiMgQ1YgY2FsY3VsYXRpb24gZm9yIGFsbCBub3JtYWxpemF0aW9uIG1ldGhvZHMgdXNpbmcgbm9uLWltcHV0ZWQgZGF0YQ0KY3YuYmVmb3JlIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS08sIDEsIGN2KSwgV1Q9YXBwbHkoMl5MRlFfV1QsMSxjdikpDQpjdi5zdGFuZGFyZCA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPLnN0YW5kYXJkLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dULnN0YW5kYXJkLCAxLCBjdikpDQpjdi5taW5tYXggPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LTy5taW5tYXgsIDEsIGN2KSwgV1Q9IGFwcGx5KDJeTEZRX1dULm1pbm1heCwgMSwgY3YpKQ0KY3YubWVkIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS08ubWVkLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dULm1lZCwgMSwgY3YpKQ0KY3YubWFkIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS08ubWFkLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dULm1hZCwgMSwgY3YpKQ0KY3YubG0gPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LTy5sbSwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVC5sbSwgMSwgY3YpKQ0KY3YudnNuIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS08udnNuLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dULnZzbiwgMSwgY3YpKQ0KY3YuZWlnIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS08uZWlnZW4sIDEsIGN2KSwgV1Q9YXBwbHkoMl5MRlFfV1QuZWlnZW4sIDEsIGN2KSkNCg0KZ2dhcnJhbmdlKA0KICAgIHBsb3RvbmV2aW9saW4oY3YuYmVmb3JlLCAnT3JpZ2luYWwnKSwNCiAgICBwbG90b25ldmlvbGluKGN2LnN0YW5kYXJkLCAnWi1TY29yZScpLA0KICAgIHBsb3RvbmV2aW9saW4oY3YubWlubWF4LCAnTWluLU1heCcpLA0KICAgIHBsb3RvbmV2aW9saW4oY3YubWVkLCAnTWVkaWFuIFNjYWxpbmcnKSwNCiAgICBucm93PTIsbmNvbD0yDQopDQoNCmdnYXJyYW5nZSgNCiAgICBwbG90b25ldmlvbGluKGN2Lm1hZCwgJ01BRCBTY2FsaW5nJyksDQogICAgcGxvdG9uZXZpb2xpbihjdi5sbSwgJ0xpbmVhciBSZWdyZXNzaW9uJyksDQogICAgcGxvdG9uZXZpb2xpbihjdi52c24sICdWU04nKSwNCiAgICBwbG90b25ldmlvbGluKGN2LmVpZywgJ0VpZ2VuTVMnKSwNCiAgICBucm93PTIsbmNvbD0yDQopDQpgYGANCg0KIyMjIE1hdGkgQ29kZQ0KDQpgYGB7ciBDVjJ9DQojIENWIGNhbGN1bGF0aW9uIGZvciBhbGwgbm9ybWFsaXphdGlvbiBtZXRob2RzIHVzaW5nIGltcHV0ZWQgZGF0YQ0KY3ZfaW1wLmJlZm9yZSA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX2ltcCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9pbXAsMSxjdikpDQpjdl9pbXAuc3RhbmRhcmQgPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LT19pbXAuc3RhbmRhcmQsIDEsIGN2KSwgV1Q9YXBwbHkoMl5MRlFfV1RfaW1wLnN0YW5kYXJkLCAxLCBjdikpDQpjdl9pbXAubWlubWF4IDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09faW1wLm1pbm1heCwgMSwgY3YpLCBXVD0gYXBwbHkoMl5MRlFfV1RfaW1wLm1pbm1heCwgMSwgY3YpKQ0KY3ZfaW1wLm1lZCA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX2ltcC5tZWQsIDEsIGN2KSwgV1Q9YXBwbHkoMl5MRlFfV1RfaW1wLm1lZCwgMSwgY3YpKQ0KY3ZfaW1wLm1hZCA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX2ltcC5tYWQsIDEsIGN2KSwgV1Q9YXBwbHkoMl5MRlFfV1RfaW1wLm1hZCwgMSwgY3YpKQ0KY3ZfaW1wLmxtIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09faW1wLmxtLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dUX2ltcC5sbSwgMSwgY3YpKQ0KY3ZfaW1wLnZzbiA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX2ltcC52c24sIDEsIGN2KSwgV1Q9YXBwbHkoMl5MRlFfV1RfaW1wLnZzbiwgMSwgY3YpKQ0KY3ZfaW1wLmVpZyA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX2ltcC5laWdlbiwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9pbXAuZWlnZW4sIDEsIGN2KSkNCg0KZ2dhcnJhbmdlKA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfaW1wLmJlZm9yZSwgJ09yaWdpbmFsJyksDQogICAgcGxvdG9uZXZpb2xpbihjdl9pbXAuc3RhbmRhcmQsICdaLVNjb3JlJyksDQogICAgcGxvdG9uZXZpb2xpbihjdl9pbXAubWlubWF4LCAnTWluLU1heCcpLA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfaW1wLm1lZCwgJ01lZGlhbiBTY2FsaW5nJyksDQogICAgbnJvdz0yLG5jb2w9Mg0KKQ0KDQpnZ2FycmFuZ2UoDQogICAgcGxvdG9uZXZpb2xpbihjdl9pbXAubWFkLCAnTUFEIFNjYWxpbmcnKSwNCiAgICBwbG90b25ldmlvbGluKGN2X2ltcC5sbSwgJ0xpbmVhciBSZWdyZXNzaW9uJyksDQogICAgcGxvdG9uZXZpb2xpbihjdl9pbXAudnNuLCAnVlNOJyksDQogICAgcGxvdG9uZXZpb2xpbihjdl9pbXAuZWlnLCAnRWlnZW5NUycpLA0KICAgIG5yb3c9MixuY29sPTINCikNCmBgYA0KDQojIyMgUmFuZG9tIEZvcmVzdA0KDQpgYGB7ciBDVjN9DQojIENWIGNhbGN1bGF0aW9uIGZvciBhbGwgbm9ybWFsaXphdGlvbiBtZXRob2RzIHdpdGggaW1wdXRlZCBkYXRhIHVzaW5nIHJhbmRvbSBmb3Jlc3QNCmN2X1JGLmJlZm9yZSA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX1JGLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dUX1JGLDEsY3YpKQ0KY3ZfUkYuc3RhbmRhcmQgPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LT19SRi5zdGFuZGFyZCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9SRi5zdGFuZGFyZCwgMSwgY3YpKQ0KY3ZfUkYubWlubWF4IDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09fUkYubWlubWF4LCAxLCBjdiksIFdUPSBhcHBseSgyXkxGUV9XVF9SRi5taW5tYXgsIDEsIGN2KSkNCmN2X1JGLm1lZCA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX1JGLm1lZCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9SRi5tZWQsIDEsIGN2KSkNCmN2X1JGLm1hZCA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX1JGLm1hZCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9SRi5tYWQsIDEsIGN2KSkNCmN2X1JGLmxtIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09fUkYubG0sIDEsIGN2KSwgV1Q9YXBwbHkoMl5MRlFfV1RfUkYubG0sIDEsIGN2KSkNCmN2X1JGLnZzbiA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX1JGLnZzbiwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9SRi52c24sIDEsIGN2KSkNCmN2X1JGLmVpZyA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX1JGLmVpZ2VuLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dUX1JGLmVpZ2VuLCAxLCBjdikpDQoNCmdnYXJyYW5nZSgNCiAgICBwbG90b25ldmlvbGluKGN2X1JGLmJlZm9yZSwgJ09yaWdpbmFsJyksDQogICAgcGxvdG9uZXZpb2xpbihjdl9SRi5zdGFuZGFyZCwgJ1otU2NvcmUnKSwNCiAgICBwbG90b25ldmlvbGluKGN2X1JGLm1pbm1heCwgJ01pbi1NYXgnKSwNCiAgICBwbG90b25ldmlvbGluKGN2X1JGLm1lZCwgJ01lZGlhbiBTY2FsaW5nJyksDQogICAgbnJvdz0yLG5jb2w9Mg0KKQ0KDQpnZ2FycmFuZ2UoDQogICAgcGxvdG9uZXZpb2xpbihjdl9SRi5tYWQsICdNQUQgU2NhbGluZycpLA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfUkYubG0sICdMaW5lYXIgUmVncmVzc2lvbicpLA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfUkYudnNuLCAnVlNOJyksDQogICAgcGxvdG9uZXZpb2xpbihjdl9SRi5laWcsICdFaWdlbk1TJyksDQogICAgbnJvdz0yLG5jb2w9Mg0KKQ0KYGBgDQoNCiMjIyBLLU5lYXJlc3QgTmVpZ2hib3JzDQoNCmBgYHtyIENWNH0NCiMgQ1YgY2FsY3VsYXRpb24gZm9yIGFsbCBub3JtYWxpemF0aW9uIG1ldGhvZHMgd2l0aCBpbXB1dGVkIGRhdGEgdXNpbmcga05ODQpjdl9rTk4uYmVmb3JlIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09fa05OLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dUX2tOTiwxLGN2KSkNCmN2X2tOTi5zdGFuZGFyZCA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX2tOTi5zdGFuZGFyZCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9rTk4uc3RhbmRhcmQsIDEsIGN2KSkNCmN2X2tOTi5taW5tYXggPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LT19rTk4ubWlubWF4LCAxLCBjdiksIFdUPSBhcHBseSgyXkxGUV9XVF9rTk4ubWlubWF4LCAxLCBjdikpDQpjdl9rTk4ubWVkIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09fa05OLm1lZCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9rTk4ubWVkLCAxLCBjdikpDQpjdl9rTk4ubWFkIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09fa05OLm1hZCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9rTk4ubWFkLCAxLCBjdikpDQpjdl9rTk4ubG0gPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LT19rTk4ubG0sIDEsIGN2KSwgV1Q9YXBwbHkoMl5MRlFfV1Rfa05OLmxtLCAxLCBjdikpDQpjdl9rTk4udnNuIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09fa05OLnZzbiwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9rTk4udnNuLCAxLCBjdikpDQpjdl9rTk4uZWlnIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09fa05OLmVpZ2VuLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dUX2tOTi5laWdlbiwgMSwgY3YpKQ0KDQpnZ2FycmFuZ2UoDQogICAgcGxvdG9uZXZpb2xpbihjdl9rTk4uYmVmb3JlLCAnT3JpZ2luYWwnKSwNCiAgICBwbG90b25ldmlvbGluKGN2X2tOTi5zdGFuZGFyZCwgJ1otU2NvcmUnKSwNCiAgICBwbG90b25ldmlvbGluKGN2X2tOTi5taW5tYXgsICdNaW4tTWF4JyksDQogICAgcGxvdG9uZXZpb2xpbihjdl9rTk4ubWVkLCAnTWVkaWFuIFNjYWxpbmcnKSwNCiAgICBucm93PTIsbmNvbD0yDQopDQoNCmdnYXJyYW5nZSgNCiAgICBwbG90b25ldmlvbGluKGN2X2tOTi5tYWQsICdNQUQgU2NhbGluZycpLA0KICAgIHBsb3RvbmV2aW9saW4oY3Zfa05OLmxtLCAnTGluZWFyIFJlZ3Jlc3Npb24nKSwNCiAgICBwbG90b25ldmlvbGluKGN2X2tOTi52c24sICdWU04nKSwNCiAgICBwbG90b25ldmlvbGluKGN2X2tOTi5laWcsICdFaWdlbk1TJyksDQogICAgbnJvdz0yLG5jb2w9Mg0KKQ0KYGBgDQoNCiMjIyBMdWRvdmljDQoNCmBgYHtyIENWNX0NCiMgQ1YgY2FsY3VsYXRpb24gZm9yIGFsbCBub3JtYWxpemF0aW9uIG1ldGhvZHMgd2l0aCBpbXB1dGVkIGRhdGEgdXNpbmcgbHVkb3ZpYw0KY3ZfbHVkb3ZpYy5iZWZvcmUgPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LT19sdWRvdmljLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dUX2x1ZG92aWMsMSxjdikpDQpjdl9sdWRvdmljLnN0YW5kYXJkIDwtIGRhdGEuZnJhbWUoS089YXBwbHkoMl5MRlFfS09fbHVkb3ZpYy5zdGFuZGFyZCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9sdWRvdmljLnN0YW5kYXJkLCAxLCBjdikpDQpjdl9sdWRvdmljLm1pbm1heCA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX2x1ZG92aWMubWlubWF4LCAxLCBjdiksIFdUPSBhcHBseSgyXkxGUV9XVF9sdWRvdmljLm1pbm1heCwgMSwgY3YpKQ0KY3ZfbHVkb3ZpYy5tZWQgPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LT19sdWRvdmljLm1lZCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9sdWRvdmljLm1lZCwgMSwgY3YpKQ0KY3ZfbHVkb3ZpYy5tYWQgPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LT19sdWRvdmljLm1hZCwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9sdWRvdmljLm1hZCwgMSwgY3YpKQ0KY3ZfbHVkb3ZpYy5sbSA8LSBkYXRhLmZyYW1lKEtPPWFwcGx5KDJeTEZRX0tPX2x1ZG92aWMubG0sIDEsIGN2KSwgV1Q9YXBwbHkoMl5MRlFfV1RfbHVkb3ZpYy5sbSwgMSwgY3YpKQ0KY3ZfbHVkb3ZpYy52c24gPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LT19sdWRvdmljLnZzbiwgMSwgY3YpLCBXVD1hcHBseSgyXkxGUV9XVF9sdWRvdmljLnZzbiwgMSwgY3YpKQ0KY3ZfbHVkb3ZpYy5laWcgPC0gZGF0YS5mcmFtZShLTz1hcHBseSgyXkxGUV9LT19sdWRvdmljLmVpZ2VuLCAxLCBjdiksIFdUPWFwcGx5KDJeTEZRX1dUX2x1ZG92aWMuZWlnZW4sIDEsIGN2KSkNCg0KZ2dhcnJhbmdlKA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfbHVkb3ZpYy5iZWZvcmUsICdPcmlnaW5hbCcpLA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfbHVkb3ZpYy5zdGFuZGFyZCwgJ1otU2NvcmUnKSwNCiAgICBwbG90b25ldmlvbGluKGN2X2x1ZG92aWMubWlubWF4LCAnTWluLU1heCcpLA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfbHVkb3ZpYy5tZWQsICdNZWRpYW4gU2NhbGluZycpLA0KICAgIG5yb3c9MixuY29sPTINCikNCg0KZ2dhcnJhbmdlKA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfbHVkb3ZpYy5tYWQsICdNQUQgU2NhbGluZycpLA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfbHVkb3ZpYy5sbSwgJ0xpbmVhciBSZWdyZXNzaW9uJyksDQogICAgcGxvdG9uZXZpb2xpbihjdl9sdWRvdmljLnZzbiwgJ1ZTTicpLA0KICAgIHBsb3RvbmV2aW9saW4oY3ZfbHVkb3ZpYy5laWcsICdFaWdlbk1TJyksDQogICAgbnJvdz0yLG5jb2w9Mg0KKQ0KYGBgDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyfQ0KIyBiaW5kIGFsbCBjYWxjdWxhdGVkIENWIHZhbHVlcyBpbnRvIG9uZSBkYXRhIGZyYW1lIC0gTm9uLUltcHV0ZWQNCmN2X2FsbCA8LSBkYXRhLmZyYW1lKGN2LmJlZm9yZSwgY3Yuc3RhbmRhcmQsIGN2Lm1pbm1heCwgY3YubWVkLA0KICAgICAgICAgICAgICAgICAgICAgY3YubWFkLCBjdi5sbSwgY3YudnNuKQ0KY29sbmFtZXMoY3ZfYWxsKSA8LSBjKCdCZWZvcmVfS08nLCAnQmVmb3JlX1dUJywgJ1otc2NvcmVfS08nLCAnWi1zY29yZV9XVCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICdNaW5NYXhfS08nLCAnTWluTWF4X1dUJywgJ01lZGlhbl9LTycsICdNZWRpYW5fV1QnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ01BRF9LTycsICdNQURfV1QnLCAnTGluZWFyX0tPJywgJ0xpbmVhcl9XVCcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAnVlNOX0tPJywgJ1ZTTl9XVCcpDQoNCiMgdGhpcyBvbmUgaXMgc2VwYXJhdGVkIGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVudCBudW1iZXIgb2Ygcm93cw0KY29sbmFtZXMoY3YuZWlnKSA8LSBjKCdFaWdlbk1TX0tPJywgJ0VpZ2VuTVNfV1QnKQ0KDQojIGJpbmQgYWxsIGNhbGN1bGF0ZWQgQ1YgdmFsdWVzIGludG8gb25lIGRhdGEgZnJhbWUgLSBJbXB1dGVkDQpjdl9pbXBfYWxsIDwtIGRhdGEuZnJhbWUoY3ZfaW1wLmJlZm9yZSwgY3ZfaW1wLnN0YW5kYXJkLCBjdl9pbXAubWlubWF4LCBjdl9pbXAubWVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGN2X2ltcC5tYWQsIGN2X2ltcC5sbSwgY3ZfaW1wLnZzbiwgY3ZfaW1wLmVpZykNCmNvbG5hbWVzKGN2X2ltcF9hbGwpIDwtIGMoJ0JlZm9yZV9LTycsICdCZWZvcmVfV1QnLCAnWi1zY29yZV9LTycsICdaLXNjb3JlX1dUJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ01pbk1heF9LTycsICdNaW5NYXhfV1QnLCAnTWVkaWFuX0tPJywgJ01lZGlhbl9XVCcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAnTUFEX0tPJywgJ01BRF9XVCcsICdMaW5lYXJfS08nLCAnTGluZWFyX1dUJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICdWU05fS08nLCAnVlNOX1dUJywgJ0VpZ2VuTVNfS08nLCAnRWlnZW5NU19XVCcpDQoNCiMgYmluZCBhbGwgY2FsY3VsYXRlZCBDViB2YWx1ZXMgaW50byBvbmUgZGF0YSBmcmFtZSAtIFJhbmRvbSBGb3Jlc3QNCmN2X1JGX2FsbCA8LSBkYXRhLmZyYW1lKGN2X1JGLmJlZm9yZSwgY3ZfUkYuc3RhbmRhcmQsIGN2X1JGLm1pbm1heCwgY3ZfUkYubWVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGN2X1JGLm1hZCwgY3ZfUkYubG0sIGN2X1JGLnZzbiwgY3ZfUkYuZWlnKQ0KY29sbmFtZXMoY3ZfUkZfYWxsKSA8LSBjKCdCZWZvcmVfS08nLCAnQmVmb3JlX1dUJywgJ1otc2NvcmVfS08nLCAnWi1zY29yZV9XVCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICdNaW5NYXhfS08nLCAnTWluTWF4X1dUJywgJ01lZGlhbl9LTycsICdNZWRpYW5fV1QnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ01BRF9LTycsICdNQURfV1QnLCAnTGluZWFyX0tPJywgJ0xpbmVhcl9XVCcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAnVlNOX0tPJywgJ1ZTTl9XVCcsICdFaWdlbk1TX0tPJywgJ0VpZ2VuTVNfV1QnKQ0KDQojIGJpbmQgYWxsIGNhbGN1bGF0ZWQgQ1YgdmFsdWVzIGludG8gb25lIGRhdGEgZnJhbWUgLSBrTk4NCmN2X2tOTl9hbGwgPC0gZGF0YS5mcmFtZShjdl9rTk4uYmVmb3JlLCBjdl9rTk4uc3RhbmRhcmQsIGN2X2tOTi5taW5tYXgsIGN2X2tOTi5tZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgY3Zfa05OLm1hZCwgY3Zfa05OLmxtLCBjdl9rTk4udnNuLCBjdl9rTk4uZWlnKQ0KY29sbmFtZXMoY3Zfa05OX2FsbCkgPC0gYygnQmVmb3JlX0tPJywgJ0JlZm9yZV9XVCcsICdaLXNjb3JlX0tPJywgJ1otc2NvcmVfV1QnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAnTWluTWF4X0tPJywgJ01pbk1heF9XVCcsICdNZWRpYW5fS08nLCAnTWVkaWFuX1dUJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICdNQURfS08nLCAnTUFEX1dUJywgJ0xpbmVhcl9LTycsICdMaW5lYXJfV1QnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZTTl9LTycsICdWU05fV1QnLCAnRWlnZW5NU19LTycsICdFaWdlbk1TX1dUJykNCg0KIyBiaW5kIGFsbCBjYWxjdWxhdGVkIENWIHZhbHVlcyBpbnRvIG9uZSBkYXRhIGZyYW1lIC0gTHVkb3ZpYw0KY3ZfbHVkb3ZpY19hbGwgPC0gZGF0YS5mcmFtZShjdl9sdWRvdmljLmJlZm9yZSwgY3ZfbHVkb3ZpYy5zdGFuZGFyZCwgY3ZfbHVkb3ZpYy5taW5tYXgsIGN2X2x1ZG92aWMubWVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGN2X2x1ZG92aWMubWFkLCBjdl9sdWRvdmljLmxtLCBjdl9sdWRvdmljLnZzbiwgY3ZfbHVkb3ZpYy5laWcpDQpjb2xuYW1lcyhjdl9sdWRvdmljX2FsbCkgPC0gYygnQmVmb3JlX0tPJywgJ0JlZm9yZV9XVCcsICdaLXNjb3JlX0tPJywgJ1otc2NvcmVfV1QnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAnTWluTWF4X0tPJywgJ01pbk1heF9XVCcsICdNZWRpYW5fS08nLCAnTWVkaWFuX1dUJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICdNQURfS08nLCAnTUFEX1dUJywgJ0xpbmVhcl9LTycsICdMaW5lYXJfV1QnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZTTl9LTycsICdWU05fV1QnLCAnRWlnZW5NU19LTycsICdFaWdlbk1TX1dUJykNCmBgYA0KDQpgYGB7cn0NCiMjIyMgTk9OLUlNUFVURUQgIyMjIw0KY3Zfc3VtbWFyeV9LTyA8LSBjdl9hbGwgfD4gICAjIGNhbGN1bGF0aW5nIGJhc2ljIHN0YXRpc3RpY3MgZm9yIEtPDQogICAgc2VsZWN0KGNvbnRhaW5zKCdLTycpKSB8Pg0KICAgIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gJ21ldGhvZCBLTycsIHZhbHVlc190byA9ICdMRlFfQ1YnKSB8Pg0KICAgIGdyb3VwX2J5KGBtZXRob2QgS09gKSB8Pg0KICAgIHN1bW1hcmlzZSgnbWVhbl9LTyc9cm91bmQobWVhbihMRlFfQ1YsIG5hLnJtPVRSVUUpLDUpLCANCiAgICAgICAgICAgICAgJ21lZGlhbl9LTyc9cm91bmQobWVkaWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnc2RfS08nPXJvdW5kKHNkKExGUV9DViwgbmEucm09VFJVRSksNSkpDQoNCmN2X3N1bW1hcnlfV1QgPC0gY3ZfYWxsIHw+ICAgIyBjYWxjdWxhdGluZyBiYXNpYyBzdGF0aXN0aWNzIGZvciBXVCANCiAgICBzZWxlY3QoY29udGFpbnMoJ1dUJykpIHw+DQogICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAnbWV0aG9kIFdUJywgdmFsdWVzX3RvID0gJ0xGUV9DVicpIHw+DQogICAgZ3JvdXBfYnkoYG1ldGhvZCBXVGApIHw+DQogICAgc3VtbWFyaXNlKCdtZWFuX1dUJz1yb3VuZChtZWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnbWVkaWFuX1dUJz1yb3VuZChtZWRpYW4oTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSwgDQogICAgICAgICAgICAgICdzZF9XVCc9cm91bmQoc2QoTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSkNCg0KY3Zfc3VtbWFyeV9laWdlbl9LTyA8LSB0aWJibGUoY3YuZWlnKSB8PiAgICMgY2FsY3VsYXRpbmcgYmFzaWMgc3RhdGlzdGljcyBmb3IgZWlnZW4gS08NCiAgICBzZWxlY3QoY29udGFpbnMoJ0tPJykpIHw+DQogICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAnbWV0aG9kIEtPJywgdmFsdWVzX3RvID0gJ0xGUV9DVicpIHw+DQogICAgZ3JvdXBfYnkoYG1ldGhvZCBLT2ApIHw+DQogICAgc3VtbWFyaXNlKCdtZWFuX0tPJz1yb3VuZChtZWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnbWVkaWFuX0tPJz1yb3VuZChtZWRpYW4oTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSwgDQogICAgICAgICAgICAgICdzZF9LTyc9cm91bmQoc2QoTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSkNCg0KY3Zfc3VtbWFyeV9laWdlbl9XVCA8LSB0aWJibGUoY3YuZWlnKSB8PiAgICMgY2FsY3VsYXRpbmcgYmFzaWMgc3RhdGlzdGljcyBmb3IgZWlnZW4gV1QNCiAgICBzZWxlY3QoY29udGFpbnMoJ1dUJykpIHw+DQogICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAnbWV0aG9kIFdUJywgdmFsdWVzX3RvID0gJ0xGUV9DVicpIHw+DQogICAgZ3JvdXBfYnkoYG1ldGhvZCBXVGApIHw+DQogICAgc3VtbWFyaXNlKCdtZWFuX1dUJz1yb3VuZChtZWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnbWVkaWFuX1dUJz1yb3VuZChtZWRpYW4oTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSwgDQogICAgICAgICAgICAgICdzZF9XVCc9cm91bmQoc2QoTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSkNCg0KIyMjIyBNQVRJIENPREUgIyMjIw0KY3ZfaW1wX3N1bW1hcnlfS08gPC0gY3ZfaW1wX2FsbCB8PiAgICMgY2FsY3VsYXRpbmcgYmFzaWMgc3RhdGlzdGljcyBmb3IgS08NCiAgICBzZWxlY3QoY29udGFpbnMoJ0tPJykpIHw+DQogICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAnbWV0aG9kIEtPJywgdmFsdWVzX3RvID0gJ0xGUV9DVicpIHw+DQogICAgZ3JvdXBfYnkoYG1ldGhvZCBLT2ApIHw+DQogICAgc3VtbWFyaXNlKCdtZWFuX0tPJz1yb3VuZChtZWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnbWVkaWFuX0tPJz1yb3VuZChtZWRpYW4oTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSwgDQogICAgICAgICAgICAgICdzZF9LTyc9cm91bmQoc2QoTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSkNCg0KY3ZfaW1wX3N1bW1hcnlfV1QgPC0gY3ZfaW1wX2FsbCB8PiAgICMgY2FsY3VsYXRpbmcgYmFzaWMgc3RhdGlzdGljcyBmb3IgV1QNCiAgICBzZWxlY3QoY29udGFpbnMoJ1dUJykpIHw+DQogICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAnbWV0aG9kIFdUJywgdmFsdWVzX3RvID0gJ0xGUV9DVicpIHw+DQogICAgZ3JvdXBfYnkoYG1ldGhvZCBXVGApIHw+DQogICAgc3VtbWFyaXNlKCdtZWFuX1dUJz1yb3VuZChtZWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnbWVkaWFuX1dUJz1yb3VuZChtZWRpYW4oTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSwgDQogICAgICAgICAgICAgICdzZF9XVCc9cm91bmQoc2QoTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSkNCg0KIyMjIyBSQU5ET00gRk9SRVNUICMjIyMNCmN2X1JGX3N1bW1hcnlfS08gPC0gY3ZfUkZfYWxsIHw+ICAgIyBjYWxjdWxhdGluZyBiYXNpYyBzdGF0aXN0aWNzIGZvciBLTw0KICAgIHNlbGVjdChjb250YWlucygnS08nKSkgfD4NCiAgICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190byA9ICdtZXRob2QgS08nLCB2YWx1ZXNfdG8gPSAnTEZRX0NWJykgfD4NCiAgICBncm91cF9ieShgbWV0aG9kIEtPYCkgfD4NCiAgICBzdW1tYXJpc2UoJ21lYW5fS08nPXJvdW5kKG1lYW4oTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSwgDQogICAgICAgICAgICAgICdtZWRpYW5fS08nPXJvdW5kKG1lZGlhbihMRlFfQ1YsIG5hLnJtPVRSVUUpLDUpLCANCiAgICAgICAgICAgICAgJ3NkX0tPJz1yb3VuZChzZChMRlFfQ1YsIG5hLnJtPVRSVUUpLDUpKQ0KDQpjdl9SRl9zdW1tYXJ5X1dUIDwtIGN2X1JGX2FsbCB8PiAgICMgY2FsY3VsYXRpbmcgYmFzaWMgc3RhdGlzdGljcyBmb3IgV1QNCiAgICBzZWxlY3QoY29udGFpbnMoJ1dUJykpIHw+DQogICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAnbWV0aG9kIFdUJywgdmFsdWVzX3RvID0gJ0xGUV9DVicpIHw+DQogICAgZ3JvdXBfYnkoYG1ldGhvZCBXVGApIHw+DQogICAgc3VtbWFyaXNlKCdtZWFuX1dUJz1yb3VuZChtZWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnbWVkaWFuX1dUJz1yb3VuZChtZWRpYW4oTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSwgDQogICAgICAgICAgICAgICdzZF9XVCc9cm91bmQoc2QoTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSkNCg0KIyMjIyBLLU5FQVJFU1QgTkVJR0hCT1JTICMjIyMNCmN2X2tOTl9zdW1tYXJ5X0tPIDwtIGN2X2tOTl9hbGwgfD4gICAjIGNhbGN1bGF0aW5nIGJhc2ljIHN0YXRpc3RpY3MgZm9yIEtPDQogICAgc2VsZWN0KGNvbnRhaW5zKCdLTycpKSB8Pg0KICAgIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gJ21ldGhvZCBLTycsIHZhbHVlc190byA9ICdMRlFfQ1YnKSB8Pg0KICAgIGdyb3VwX2J5KGBtZXRob2QgS09gKSB8Pg0KICAgIHN1bW1hcmlzZSgnbWVhbl9LTyc9cm91bmQobWVhbihMRlFfQ1YsIG5hLnJtPVRSVUUpLDUpLCANCiAgICAgICAgICAgICAgJ21lZGlhbl9LTyc9cm91bmQobWVkaWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnc2RfS08nPXJvdW5kKHNkKExGUV9DViwgbmEucm09VFJVRSksNSkpDQoNCmN2X2tOTl9zdW1tYXJ5X1dUIDwtIGN2X2tOTl9hbGwgfD4gICAjIGNhbGN1bGF0aW5nIGJhc2ljIHN0YXRpc3RpY3MgZm9yIFdUDQogICAgc2VsZWN0KGNvbnRhaW5zKCdXVCcpKSB8Pg0KICAgIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gJ21ldGhvZCBXVCcsIHZhbHVlc190byA9ICdMRlFfQ1YnKSB8Pg0KICAgIGdyb3VwX2J5KGBtZXRob2QgV1RgKSB8Pg0KICAgIHN1bW1hcmlzZSgnbWVhbl9XVCc9cm91bmQobWVhbihMRlFfQ1YsIG5hLnJtPVRSVUUpLDUpLCANCiAgICAgICAgICAgICAgJ21lZGlhbl9XVCc9cm91bmQobWVkaWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnc2RfV1QnPXJvdW5kKHNkKExGUV9DViwgbmEucm09VFJVRSksNSkpDQoNCiMjIyMgTFVET1ZJQyAjIyMjDQpjdl9sdWRvdmljX3N1bW1hcnlfS08gPC0gY3ZfbHVkb3ZpY19hbGwgfD4gICAjIGNhbGN1bGF0aW5nIGJhc2ljIHN0YXRpc3RpY3MgZm9yIEtPDQogICAgc2VsZWN0KGNvbnRhaW5zKCdLTycpKSB8Pg0KICAgIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gJ21ldGhvZCBLTycsIHZhbHVlc190byA9ICdMRlFfQ1YnKSB8Pg0KICAgIGdyb3VwX2J5KGBtZXRob2QgS09gKSB8Pg0KICAgIHN1bW1hcmlzZSgnbWVhbl9LTyc9cm91bmQobWVhbihMRlFfQ1YsIG5hLnJtPVRSVUUpLDUpLCANCiAgICAgICAgICAgICAgJ21lZGlhbl9LTyc9cm91bmQobWVkaWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnc2RfS08nPXJvdW5kKHNkKExGUV9DViwgbmEucm09VFJVRSksNSkpDQoNCmN2X2x1ZG92aWNfc3VtbWFyeV9XVCA8LSBjdl9sdWRvdmljX2FsbCB8PiAgICMgY2FsY3VsYXRpbmcgYmFzaWMgc3RhdGlzdGljcyBmb3IgV1QNCiAgICBzZWxlY3QoY29udGFpbnMoJ1dUJykpIHw+DQogICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAnbWV0aG9kIFdUJywgdmFsdWVzX3RvID0gJ0xGUV9DVicpIHw+DQogICAgZ3JvdXBfYnkoYG1ldGhvZCBXVGApIHw+DQogICAgc3VtbWFyaXNlKCdtZWFuX1dUJz1yb3VuZChtZWFuKExGUV9DViwgbmEucm09VFJVRSksNSksIA0KICAgICAgICAgICAgICAnbWVkaWFuX1dUJz1yb3VuZChtZWRpYW4oTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSwgDQogICAgICAgICAgICAgICdzZF9XVCc9cm91bmQoc2QoTEZRX0NWLCBuYS5ybT1UUlVFKSw1KSkNCg0KIyMjIyBTVU1NQVJZICMjIyMgDQojIHByZXBhcmUgbW9yZSByZWFkYWJsZSBvdXRwdXQgLSBOb24tSXBtdXRlZA0KY3Zfc3VtbWFyeSA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHJiaW5kKGN2X3N1bW1hcnlfS08sIGN2X3N1bW1hcnlfZWlnZW5fS08pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiaW5kKGN2X3N1bW1hcnlfV1RbLTFdLCBjdl9zdW1tYXJ5X2VpZ2VuX1dUWy0xXSkpKSB8Pg0KICAgIGRwbHlyOjphcnJhbmdlKGBtZXRob2QgS09gKQ0KY29sbmFtZXMoY3Zfc3VtbWFyeSlbMV0gPC0gJ21ldGhvZCcNCmN2X3N1bW1hcnkkbWV0aG9kIDwtIGdzdWIoJ19LTycsICcnLCBjdl9zdW1tYXJ5JG1ldGhvZCkNCg0KIyBwcmVwYXJlIG1vcmUgcmVhZGFibGUgb3V0cHV0IC0gSW1wdXRlZA0KY3ZfaW1wX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShjYmluZChjdl9pbXBfc3VtbWFyeV9LTywgY3ZfaW1wX3N1bW1hcnlfV1RbLTFdKSkNCmNvbG5hbWVzKGN2X2ltcF9zdW1tYXJ5KVsxXSA8LSAnbWV0aG9kJw0KY3ZfaW1wX3N1bW1hcnkkbWV0aG9kIDwtIGdzdWIoJ19LTycsICcnLCBjdl9pbXBfc3VtbWFyeSRtZXRob2QpDQoNCiMgcHJlcGFyZSBtb3JlIHJlYWRhYmxlIG91dHB1dCAtIFJhbmRvbSBGb3Jlc3QNCmN2X1JGX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShjYmluZChjdl9SRl9zdW1tYXJ5X0tPLCBjdl9SRl9zdW1tYXJ5X1dUWy0xXSkpDQpjb2xuYW1lcyhjdl9SRl9zdW1tYXJ5KVsxXSA8LSAnbWV0aG9kJw0KY3ZfUkZfc3VtbWFyeSRtZXRob2QgPC0gZ3N1YignX0tPJywgJycsIGN2X1JGX3N1bW1hcnkkbWV0aG9kKQ0KDQojIHByZXBhcmUgbW9yZSByZWFkYWJsZSBvdXRwdXQgLSBrTk4NCmN2X2tOTl9zdW1tYXJ5IDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoY3Zfa05OX3N1bW1hcnlfS08sIGN2X2tOTl9zdW1tYXJ5X1dUWy0xXSkpDQpjb2xuYW1lcyhjdl9rTk5fc3VtbWFyeSlbMV0gPC0gJ21ldGhvZCcNCmN2X2tOTl9zdW1tYXJ5JG1ldGhvZCA8LSBnc3ViKCdfS08nLCAnJywgY3Zfa05OX3N1bW1hcnkkbWV0aG9kKQ0KDQojIHByZXBhcmUgbW9yZSByZWFkYWJsZSBvdXRwdXQgLSBMdWRvdmljDQpjdl9sdWRvdmljX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShjYmluZChjdl9sdWRvdmljX3N1bW1hcnlfS08sIGN2X2x1ZG92aWNfc3VtbWFyeV9XVFstMV0pKQ0KY29sbmFtZXMoY3ZfbHVkb3ZpY19zdW1tYXJ5KVsxXSA8LSAnbWV0aG9kJw0KY3ZfbHVkb3ZpY19zdW1tYXJ5JG1ldGhvZCA8LSBnc3ViKCdfS08nLCAnJywgY3ZfbHVkb3ZpY19zdW1tYXJ5JG1ldGhvZCkNCmBgYA0KDQojIyMjIE5vbi1JbXB1dGVkIA0KDQpgYGB7cn0NCnNob3dfY3ZfdGFibGUoY3Zfc3VtbWFyeSkNCmBgYA0KDQojIyMjIEltcHV0ZWQgLSBNYXRpIENvZGUgDQoNCmBgYHtyfQ0Kc2hvd19jdl90YWJsZShjdl9pbXBfc3VtbWFyeSkNCmBgYA0KDQojIyMjIFJhbmRvbSBGb3Jlc3QgDQoNCmBgYHtyfQ0Kc2hvd19jdl90YWJsZShjdl9SRl9zdW1tYXJ5KQ0KYGBgDQoNCiMjIyMgSy1OZWFyZXN0IE5laWdoYm9ycyANCg0KYGBge3J9DQpzaG93X2N2X3RhYmxlKGN2X2tOTl9zdW1tYXJ5KQ0KYGBgDQoNCiMjIyMgTHVkb3ZpYw0KDQpgYGB7cn0NCnNob3dfY3ZfdGFibGUoY3ZfbHVkb3ZpY19zdW1tYXJ5KQ0KYGBgDQoNCiMjIElDQyB7LnRhYnNldH0NCg0KQWZ0ZXIgbm9ybWFsaXphdGlvbiwgYmlvbG9naWNhbCByZXBsaWNhdGVzIHNob3VsZCBncm91cCBtb3JlIHRpZ2h0bHkuIFdlIGNhbiANCmFzc2VzcyB0aGlzIGJ5IG1lYXN1cmluZyB0aGUgKipJbnRyYWNsYXNzIENvcnJlbGF0aW9uIENvZWZmaWNpZW50IChJQ0MpKiogdG8gc2VlIGlmIA0KcmVwbGljYXRlcyBjbHVzdGVyIHRvZ2V0aGVyLg0KDQpBIGd1aWRlbGluZXMgZm9yIGludGVycHJldGF0aW9uIGJ5IFtLb28gYW5kIExpICgyMDE2KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYlMkZqLmpjbS4yMDE2LjAyLjAxMik6DQoNCjxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7Ij4NCg0KPGRpdiBzdHlsZT0iZmxleDogNTAlOyI+DQo8dWw+DQo8bGk+YmVsb3cgMC41MDogcG9vciA8c3BhbiBzdHlsZT0iY29sb3I6I0QzRDNEMztmb250LXNpemU6MjZweCI+4pagPC9zcGFuPjwvbGk+DQo8bGk+YmV0d2VlbiAwLjUwIGFuZCAwLjc1OiBtb2RlcmF0ZSA8c3BhbiBzdHlsZT0iY29sb3I6I2FlZmRhMTtmb250LXNpemU6MjZweCI+4pagPC9zcGFuPjwvbGk+DQo8L3VsPg0KPC9kaXY+DQoNCjxkaXYgc3R5bGU9ImZsZXg6IDUwJTsiPg0KPHVsPg0KPGxpPmJldHdlZW4gMC43NSBhbmQgMC45MDogZ29vZCA8c3BhbiBzdHlsZT0iY29sb3I6IzZkZmY1NDtmb250LXNpemU6MjZweCI+4pagPC9zcGFuPjwvbGk+DQo8bGk+YWJvdmUgMC45MDogZXhjZWxsZW50IDxzcGFuIHN0eWxlPSJjb2xvcjojMWJiNDAwO2ZvbnQtc2l6ZToyNnB4Ij7ilqA8L3NwYW4+PC9saT4NCjwvdWw+DQo8L2Rpdj4NCg0KPC9kaXY+DQoNCioqU3VtbWFyeSoqDQpXZSBjYW4gY2xlYXJseSBzZWUgdGhhdCB0aGUgcmVwbGljYXRlcyBhcmUgdGhlIG1vc3QgdGlnaHQgYWZ0ZXIgdGhlIG5vcm1hbGl6YXRpb24gDQp1c2luZyB0aGUgKipFaWdlbk1TKiogbWV0aG9kLiBBbG1vc3QgYWxsIG1ldGhvZHMgZ3JvdXAgcmVwbGljYXRlcyBtb3JlIHRpZ2h0bHksIA0KZXhjZXB0IHRoZSAqKk1pbi1NYXgqKiBhbmQgKipNZWRpYW4qKiBtZXRob2RzLCB3aGVyZSB0aGUgSUNDcyB3ZXJlIG1vZGVyYXRlIG9yIGdvb2QuDQoNCg0KIyMjIE5vbi1JbXB1dGVkDQoNCmBgYHtyIElDQzF9DQojIENhbGN1bGF0ZSBJQ0MgZm9yIE5vbi1JbXB1dGVkIEtPIGRhdGENCmljYy5LTy5iZWZvcmUgPC0gaXJyOjppY2MoMl5MRlFfS08pJHZhbHVlDQppY2MuS08uc3RhbmRhcmQgPC0gaXJyOjppY2MoMl5MRlFfS08uc3RhbmRhcmQpJHZhbHVlDQppY2MuS08ubWlubWF4IDwtIGlycjo6aWNjKDJeTEZRX0tPLm1pbm1heCkkdmFsdWUNCmljYy5LTy5tZWQgPC0gaXJyOjppY2MoMl5MRlFfS08ubWVkKSR2YWx1ZQ0KaWNjLktPLm1hZCA8LSBpcnI6OmljYygyXkxGUV9LTy5tYWQpJHZhbHVlDQppY2MuS08ubG0gPC0gaXJyOjppY2MoMl5MRlFfS08ubG0pJHZhbHVlDQppY2MuS08udnNuIDwtIGlycjo6aWNjKDJeTEZRX0tPLnZzbikkdmFsdWUNCmljYy5LTy5laWcgPC0gaXJyOjppY2MoMl5MRlFfS08uZWlnZW4pJHZhbHVlDQoNCiMgQmluZCBhbGwgY2FsY3VsYXRlZCBJQ0NzIHRvIGEgZGF0YSBmcmFtZQ0KaWNjLktPLmFsbCA8LSBkYXRhLmZyYW1lKGBJQ0MgS09gPWMoaWNjLktPLmJlZm9yZSwgaWNjLktPLnN0YW5kYXJkLCBpY2MuS08ubWlubWF4LCBpY2MuS08ubWVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjLktPLm1hZCwgaWNjLktPLmxtLCBpY2MuS08udnNuLCBpY2MuS08uZWlnKSkNCnJvd25hbWVzKGljYy5LTy5hbGwpIDwtIGMoJ0JlZm9yZScsICdaLXNjb3JlJywgJ01pbk1heCcsICdNZWRpYW4nLCAnTUFEJywgJ0xpbmVhcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAnVlNOJywgJ0VpZ2VuTVMnKQ0KDQojIENhbGN1bGF0ZSBJQ0MgZm9yIE5vbi1JbXB1dGVkIFdUIGRhdGENCmljYy5XVC5iZWZvcmUgPC0gaXJyOjppY2MoMl5MRlFfV1QpJHZhbHVlDQppY2MuV1Quc3RhbmRhcmQgPC0gaXJyOjppY2MoMl5MRlFfV1Quc3RhbmRhcmQpJHZhbHVlDQppY2MuV1QubWlubWF4IDwtIGlycjo6aWNjKDJeTEZRX1dULm1pbm1heCkkdmFsdWUNCmljYy5XVC5tZWQgPC0gaXJyOjppY2MoMl5MRlFfV1QubWVkKSR2YWx1ZQ0KaWNjLldULm1hZCA8LSBpcnI6OmljYygyXkxGUV9XVC5tYWQpJHZhbHVlDQppY2MuV1QubG0gPC0gaXJyOjppY2MoMl5MRlFfV1QubG0pJHZhbHVlDQppY2MuV1QudnNuIDwtIGlycjo6aWNjKDJeTEZRX1dULnZzbikkdmFsdWUNCmljYy5XVC5laWcgPC0gaXJyOjppY2MoMl5MRlFfV1QuZWlnZW4pJHZhbHVlDQoNCiMgQmluZCBhbGwgY2FsY3VsYXRlZCBJQ0NzIHRvIGEgZGF0YSBmcmFtZQ0KaWNjLldULmFsbCA8LSBkYXRhLmZyYW1lKGBJQ0MgV1RgPWMoaWNjLldULmJlZm9yZSwgaWNjLldULnN0YW5kYXJkLCBpY2MuV1QubWlubWF4LCBpY2MuV1QubWVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjLldULm1hZCwgaWNjLldULmxtLCBpY2MuV1QudnNuLCBpY2MuV1QuZWlnKSkNCnJvd25hbWVzKGljYy5XVC5hbGwpIDwtIGMoJ0JlZm9yZScsICdaLXNjb3JlJywgJ01pbk1heCcsICdNZWRpYW4nLCAnTUFEJywgJ0xpbmVhcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAnVlNOJywgJ0VpZ2VuTVMnKQ0KDQojIFNob3cgdGhlIHRhYmxlIGluIGEgbmljZSBmb3JtYXQNCkRUOjpkYXRhdGFibGUoY2JpbmQoaWNjLktPLmFsbCwgaWNjLldULmFsbCksIA0KICAgICAgICAgICAgICBvcHRpb25zPWxpc3Qoc2VhcmNoaW5nPUZBTFNFLCBwYWdpbmc9RkFMU0UsIGluZm89RkFMU0UpKSB8Pg0KICAgIERUOjpmb3JtYXRTdHlsZShjb2x1bW5zID0gYygnSUNDLktPJywgJ0lDQy5XVCcpLCANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IERUOjpzdHlsZUludGVydmFsKGMoMC41LDAuNzUsMC45KSwgYygnI0QzRDNEMycsICcjYWVmZGExJywgJyM2ZGZmNTQnLCAnIzFiYjQwMCcpKSkNCmBgYA0KDQojIyMgTWF0aSBDb2RlDQoNCmBgYHtyIElDQzJ9DQojIENhbGN1bGF0ZSBJQ0MgZm9yIEltcHV0ZWQgS08gZGF0YQ0KaWNjX2ltcC5LTy5iZWZvcmUgPC0gaXJyOjppY2MoMl5MRlFfS09faW1wKSR2YWx1ZQ0KaWNjX2ltcC5LTy5zdGFuZGFyZCA8LSBpcnI6OmljYygyXkxGUV9LT19pbXAuc3RhbmRhcmQpJHZhbHVlDQppY2NfaW1wLktPLm1pbm1heCA8LSBpcnI6OmljYygyXkxGUV9LT19pbXAubWlubWF4KSR2YWx1ZQ0KaWNjX2ltcC5LTy5tZWQgPC0gaXJyOjppY2MoMl5MRlFfS09faW1wLm1lZCkkdmFsdWUNCmljY19pbXAuS08ubWFkIDwtIGlycjo6aWNjKDJeTEZRX0tPX2ltcC5tYWQpJHZhbHVlDQppY2NfaW1wLktPLmxtIDwtIGlycjo6aWNjKDJeTEZRX0tPX2ltcC5sbSkkdmFsdWUNCmljY19pbXAuS08udnNuIDwtIGlycjo6aWNjKDJeTEZRX0tPX2ltcC52c24pJHZhbHVlDQppY2NfaW1wLktPLmVpZyA8LSBpcnI6OmljYygyXkxGUV9LT19pbXAuZWlnZW4pJHZhbHVlDQoNCiMgQmluZCBhbGwgY2FsY3VsYXRlZCBJQ0NzIHRvIGEgZGF0YSBmcmFtZQ0KaWNjX2ltcC5LTy5hbGwgPC0gZGF0YS5mcmFtZShgSUNDIEtPYD1jKGljY19pbXAuS08uYmVmb3JlLCBpY2NfaW1wLktPLnN0YW5kYXJkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NfaW1wLktPLm1pbm1heCwgaWNjX2ltcC5LTy5tZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljY19pbXAuS08ubWFkLCBpY2NfaW1wLktPLmxtLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NfaW1wLktPLnZzbiwgaWNjX2ltcC5LTy5laWcpKQ0Kcm93bmFtZXMoaWNjX2ltcC5LTy5hbGwpIDwtIGMoJ0JlZm9yZScsICdaLXNjb3JlJywgJ01pbk1heCcsICdNZWRpYW4nLCAnTUFEJywgJ0xpbmVhcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAnVlNOJywgJ0VpZ2VuTVMnKQ0KDQojIENhbGN1bGF0ZSBJQ0MgZm9yIEltcHV0ZWQgV1QgZGF0YQ0KaWNjX2ltcC5XVC5iZWZvcmUgPC0gaXJyOjppY2MoMl5MRlFfV1RfaW1wKSR2YWx1ZQ0KaWNjX2ltcC5XVC5zdGFuZGFyZCA8LSBpcnI6OmljYygyXkxGUV9XVF9pbXAuc3RhbmRhcmQpJHZhbHVlDQppY2NfaW1wLldULm1pbm1heCA8LSBpcnI6OmljYygyXkxGUV9XVF9pbXAubWlubWF4KSR2YWx1ZQ0KaWNjX2ltcC5XVC5tZWQgPC0gaXJyOjppY2MoMl5MRlFfV1RfaW1wLm1lZCkkdmFsdWUNCmljY19pbXAuV1QubWFkIDwtIGlycjo6aWNjKDJeTEZRX1dUX2ltcC5tYWQpJHZhbHVlDQppY2NfaW1wLldULmxtIDwtIGlycjo6aWNjKDJeTEZRX1dUX2ltcC5sbSkkdmFsdWUNCmljY19pbXAuV1QudnNuIDwtIGlycjo6aWNjKDJeTEZRX1dUX2ltcC52c24pJHZhbHVlDQppY2NfaW1wLldULmVpZyA8LSBpcnI6OmljYygyXkxGUV9XVF9pbXAuZWlnZW4pJHZhbHVlDQoNCiMgQmluZCBhbGwgY2FsY3VsYXRlZCBJQ0NzIHRvIGEgZGF0YSBmcmFtZQ0KaWNjX2ltcC5XVC5hbGwgPC0gZGF0YS5mcmFtZShgSUNDIFdUYD1jKGljY19pbXAuV1QuYmVmb3JlLCBpY2NfaW1wLldULnN0YW5kYXJkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NfaW1wLldULm1pbm1heCwgaWNjX2ltcC5XVC5tZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljY19pbXAuV1QubWFkLCBpY2NfaW1wLldULmxtLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NfaW1wLldULnZzbiwgaWNjX2ltcC5XVC5laWcpKQ0Kcm93bmFtZXMoaWNjX2ltcC5XVC5hbGwpIDwtIGMoJ0JlZm9yZScsICdaLXNjb3JlJywgJ01pbk1heCcsICdNZWRpYW4nLCAnTUFEJywgJ0xpbmVhcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAnVlNOJywgJ0VpZ2VuTVMnKQ0KDQojIFNob3cgdGhlIHRhYmxlIGluIGEgbmljZSBmb3JtYXQNCkRUOjpkYXRhdGFibGUoY2JpbmQoaWNjX2ltcC5LTy5hbGwsIGljY19pbXAuV1QuYWxsKSwgDQogICAgICAgICAgICAgIG9wdGlvbnM9bGlzdChzZWFyY2hpbmc9RkFMU0UsIHBhZ2luZz1GQUxTRSwgaW5mbz1GQUxTRSkpIHw+DQogICAgRFQ6OmZvcm1hdFN0eWxlKGNvbHVtbnMgPSBjKCdJQ0MuS08nLCAnSUNDLldUJyksIA0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gRFQ6OnN0eWxlSW50ZXJ2YWwoYygwLjUsMC43NSwwLjkpLCBjKCcjRDNEM0QzJywgJyNhZWZkYTEnLCAnIzZkZmY1NCcsICcjMWJiNDAwJykpKQ0KYGBgDQoNCiMjIyBSYW5kb20gRm9yZXN0DQoNCmBgYHtyIElDQzN9DQojIENhbGN1bGF0ZSBJQ0MgZm9yIEltcHV0ZWQgS08gZGF0YSB1c2luZyBSYW5kb20gRm9yZXN0DQppY2NfUkYuS08uYmVmb3JlIDwtIGlycjo6aWNjKDJeTEZRX0tPX1JGKSR2YWx1ZQ0KaWNjX1JGLktPLnN0YW5kYXJkIDwtIGlycjo6aWNjKDJeTEZRX0tPX1JGLnN0YW5kYXJkKSR2YWx1ZQ0KaWNjX1JGLktPLm1pbm1heCA8LSBpcnI6OmljYygyXkxGUV9LT19SRi5taW5tYXgpJHZhbHVlDQppY2NfUkYuS08ubWVkIDwtIGlycjo6aWNjKDJeTEZRX0tPX1JGLm1lZCkkdmFsdWUNCmljY19SRi5LTy5tYWQgPC0gaXJyOjppY2MoMl5MRlFfS09fUkYubWFkKSR2YWx1ZQ0KaWNjX1JGLktPLmxtIDwtIGlycjo6aWNjKDJeTEZRX0tPX1JGLmxtKSR2YWx1ZQ0KaWNjX1JGLktPLnZzbiA8LSBpcnI6OmljYygyXkxGUV9LT19SRi52c24pJHZhbHVlDQppY2NfUkYuS08uZWlnIDwtIGlycjo6aWNjKDJeTEZRX0tPX1JGLmVpZ2VuKSR2YWx1ZQ0KDQojIEJpbmQgYWxsIGNhbGN1bGF0ZWQgSUNDcyB0byBhIGRhdGEgZnJhbWUNCmljY19SRi5LTy5hbGwgPC0gZGF0YS5mcmFtZShgSUNDIEtPYD1jKGljY19SRi5LTy5iZWZvcmUsIGljY19SRi5LTy5zdGFuZGFyZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NfUkYuS08ubWlubWF4LCBpY2NfUkYuS08ubWVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljY19SRi5LTy5tYWQsIGljY19SRi5LTy5sbSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NfUkYuS08udnNuLCBpY2NfUkYuS08uZWlnKSkNCnJvd25hbWVzKGljY19SRi5LTy5hbGwpIDwtIGMoJ0JlZm9yZScsICdaLXNjb3JlJywgJ01pbk1heCcsICdNZWRpYW4nLCAnTUFEJywgJ0xpbmVhcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAnVlNOJywgJ0VpZ2VuTVMnKQ0KDQojIENhbGN1bGF0ZSBJQ0MgZm9yIEltcHV0ZWQgV1QgZGF0YSB1c2luZyBSYW5kb20gRm9yZXN0DQppY2NfUkYuV1QuYmVmb3JlIDwtIGlycjo6aWNjKDJeTEZRX1dUX1JGKSR2YWx1ZQ0KaWNjX1JGLldULnN0YW5kYXJkIDwtIGlycjo6aWNjKDJeTEZRX1dUX1JGLnN0YW5kYXJkKSR2YWx1ZQ0KaWNjX1JGLldULm1pbm1heCA8LSBpcnI6OmljYygyXkxGUV9XVF9SRi5taW5tYXgpJHZhbHVlDQppY2NfUkYuV1QubWVkIDwtIGlycjo6aWNjKDJeTEZRX1dUX1JGLm1lZCkkdmFsdWUNCmljY19SRi5XVC5tYWQgPC0gaXJyOjppY2MoMl5MRlFfV1RfUkYubWFkKSR2YWx1ZQ0KaWNjX1JGLldULmxtIDwtIGlycjo6aWNjKDJeTEZRX1dUX1JGLmxtKSR2YWx1ZQ0KaWNjX1JGLldULnZzbiA8LSBpcnI6OmljYygyXkxGUV9XVF9SRi52c24pJHZhbHVlDQppY2NfUkYuV1QuZWlnIDwtIGlycjo6aWNjKDJeTEZRX1dUX1JGLmVpZ2VuKSR2YWx1ZQ0KDQojIEJpbmQgYWxsIGNhbGN1bGF0ZWQgSUNDcyB0byBhIGRhdGEgZnJhbWUNCmljY19SRi5XVC5hbGwgPC0gZGF0YS5mcmFtZShgSUNDIFdUYD1jKGljY19SRi5XVC5iZWZvcmUsIGljY19SRi5XVC5zdGFuZGFyZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NfUkYuV1QubWlubWF4LCBpY2NfUkYuV1QubWVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX1JGLldULm1hZCwgaWNjX1JGLldULmxtLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljY19SRi5XVC52c24sIGljY19SRi5XVC5laWcpKQ0Kcm93bmFtZXMoaWNjX1JGLldULmFsbCkgPC0gYygnQmVmb3JlJywgJ1otc2NvcmUnLCAnTWluTWF4JywgJ01lZGlhbicsICdNQUQnLCAnTGluZWFyJywgDQogICAgICAgICAgICAgICAgICAgICAgICdWU04nLCAnRWlnZW5NUycpDQoNCiMgU2hvdyB0aGUgdGFibGUgaW4gYSBuaWNlIGZvcm1hdA0KRFQ6OmRhdGF0YWJsZShjYmluZChpY2NfUkYuS08uYWxsLCBpY2NfUkYuV1QuYWxsKSwgDQogICAgICAgICAgICAgIG9wdGlvbnM9bGlzdChzZWFyY2hpbmc9RkFMU0UsIHBhZ2luZz1GQUxTRSwgaW5mbz1GQUxTRSkpIHw+DQogICAgRFQ6OmZvcm1hdFN0eWxlKGNvbHVtbnMgPSBjKCdJQ0MuS08nLCAnSUNDLldUJyksIA0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gRFQ6OnN0eWxlSW50ZXJ2YWwoYygwLjUsMC43NSwwLjkpLCBjKCcjRDNEM0QzJywgJyNhZWZkYTEnLCAnIzZkZmY1NCcsICcjMWJiNDAwJykpKQ0KYGBgDQoNCiMjIyBLLU5lYXJlc3QgTmVpZ2hib3JzDQoNCmBgYHtyIElDQzR9DQojIENhbGN1bGF0ZSBJQ0MgZm9yIEltcHV0ZWQgS08gZGF0YSB1c2luZyBrTk4NCmljY19rTk4uS08uYmVmb3JlIDwtIGlycjo6aWNjKDJeTEZRX0tPX2tOTikkdmFsdWUNCmljY19rTk4uS08uc3RhbmRhcmQgPC0gaXJyOjppY2MoMl5MRlFfS09fa05OLnN0YW5kYXJkKSR2YWx1ZQ0KaWNjX2tOTi5LTy5taW5tYXggPC0gaXJyOjppY2MoMl5MRlFfS09fa05OLm1pbm1heCkkdmFsdWUNCmljY19rTk4uS08ubWVkIDwtIGlycjo6aWNjKDJeTEZRX0tPX2tOTi5tZWQpJHZhbHVlDQppY2Nfa05OLktPLm1hZCA8LSBpcnI6OmljYygyXkxGUV9LT19rTk4ubWFkKSR2YWx1ZQ0KaWNjX2tOTi5LTy5sbSA8LSBpcnI6OmljYygyXkxGUV9LT19rTk4ubG0pJHZhbHVlDQppY2Nfa05OLktPLnZzbiA8LSBpcnI6OmljYygyXkxGUV9LT19rTk4udnNuKSR2YWx1ZQ0KaWNjX2tOTi5LTy5laWcgPC0gaXJyOjppY2MoMl5MRlFfS09fa05OLmVpZ2VuKSR2YWx1ZQ0KDQojIEJpbmQgYWxsIGNhbGN1bGF0ZWQgSUNDcyB0byBhIGRhdGEgZnJhbWUNCmljY19rTk4uS08uYWxsIDwtIGRhdGEuZnJhbWUoYElDQyBLT2A9YyhpY2Nfa05OLktPLmJlZm9yZSwgaWNjX2tOTi5LTy5zdGFuZGFyZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2tOTi5LTy5taW5tYXgsIGljY19rTk4uS08ubWVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljY19rTk4uS08ubWFkLCBpY2Nfa05OLktPLmxtLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2Nfa05OLktPLnZzbiwgaWNjX2tOTi5LTy5laWcpKQ0Kcm93bmFtZXMoaWNjX2tOTi5LTy5hbGwpIDwtIGMoJ0JlZm9yZScsICdaLXNjb3JlJywgJ01pbk1heCcsICdNZWRpYW4nLCAnTUFEJywgJ0xpbmVhcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAnVlNOJywgJ0VpZ2VuTVMnKQ0KDQojIENhbGN1bGF0ZSBJQ0MgZm9yIEltcHV0ZWQgV1QgZGF0YSB1c2luZyBrTk4NCmljY19rTk4uV1QuYmVmb3JlIDwtIGlycjo6aWNjKDJeTEZRX1dUX2tOTikkdmFsdWUNCmljY19rTk4uV1Quc3RhbmRhcmQgPC0gaXJyOjppY2MoMl5MRlFfV1Rfa05OLnN0YW5kYXJkKSR2YWx1ZQ0KaWNjX2tOTi5XVC5taW5tYXggPC0gaXJyOjppY2MoMl5MRlFfV1Rfa05OLm1pbm1heCkkdmFsdWUNCmljY19rTk4uV1QubWVkIDwtIGlycjo6aWNjKDJeTEZRX1dUX2tOTi5tZWQpJHZhbHVlDQppY2Nfa05OLldULm1hZCA8LSBpcnI6OmljYygyXkxGUV9XVF9rTk4ubWFkKSR2YWx1ZQ0KaWNjX2tOTi5XVC5sbSA8LSBpcnI6OmljYygyXkxGUV9XVF9rTk4ubG0pJHZhbHVlDQppY2Nfa05OLldULnZzbiA8LSBpcnI6OmljYygyXkxGUV9XVF9rTk4udnNuKSR2YWx1ZQ0KaWNjX2tOTi5XVC5laWcgPC0gaXJyOjppY2MoMl5MRlFfV1Rfa05OLmVpZ2VuKSR2YWx1ZQ0KDQojIEJpbmQgYWxsIGNhbGN1bGF0ZWQgSUNDcyB0byBhIGRhdGEgZnJhbWUNCmljY19rTk4uV1QuYWxsIDwtIGRhdGEuZnJhbWUoYElDQyBXVGA9YyhpY2Nfa05OLldULmJlZm9yZSwgaWNjX2tOTi5XVC5zdGFuZGFyZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2tOTi5XVC5taW5tYXgsIGljY19rTk4uV1QubWVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2Nfa05OLldULm1hZCwgaWNjX2tOTi5XVC5sbSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2tOTi5XVC52c24sIGljY19rTk4uV1QuZWlnKSkNCnJvd25hbWVzKGljY19rTk4uV1QuYWxsKSA8LSBjKCdCZWZvcmUnLCAnWi1zY29yZScsICdNaW5NYXgnLCAnTWVkaWFuJywgJ01BRCcsICdMaW5lYXInLCANCiAgICAgICAgICAgICAgICAgICAgICAgJ1ZTTicsICdFaWdlbk1TJykNCg0KIyBTaG93IHRoZSB0YWJsZSBpbiBhIG5pY2UgZm9ybWF0DQpEVDo6ZGF0YXRhYmxlKGNiaW5kKGljY19rTk4uS08uYWxsLCBpY2Nfa05OLldULmFsbCksIA0KICAgICAgICAgICAgICBvcHRpb25zPWxpc3Qoc2VhcmNoaW5nPUZBTFNFLCBwYWdpbmc9RkFMU0UsIGluZm89RkFMU0UpKSB8Pg0KICAgIERUOjpmb3JtYXRTdHlsZShjb2x1bW5zID0gYygnSUNDLktPJywgJ0lDQy5XVCcpLCANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IERUOjpzdHlsZUludGVydmFsKGMoMC41LDAuNzUsMC45KSwgYygnI0QzRDNEMycsICcjYWVmZGExJywgJyM2ZGZmNTQnLCAnIzFiYjQwMCcpKSkNCmBgYA0KDQojIyMgTHVkb3ZpYw0KDQpgYGB7ciBJQ0M1fQ0KIyBDYWxjdWxhdGUgSUNDIGZvciBJbXB1dGVkIEtPIGRhdGEgdXNpbmcgbHVkb3ZpYw0KaWNjX2x1ZG92aWMuS08uYmVmb3JlIDwtIGlycjo6aWNjKDJeTEZRX0tPX2x1ZG92aWMpJHZhbHVlDQppY2NfbHVkb3ZpYy5LTy5zdGFuZGFyZCA8LSBpcnI6OmljYygyXkxGUV9LT19sdWRvdmljLnN0YW5kYXJkKSR2YWx1ZQ0KaWNjX2x1ZG92aWMuS08ubWlubWF4IDwtIGlycjo6aWNjKDJeTEZRX0tPX2x1ZG92aWMubWlubWF4KSR2YWx1ZQ0KaWNjX2x1ZG92aWMuS08ubWVkIDwtIGlycjo6aWNjKDJeTEZRX0tPX2x1ZG92aWMubWVkKSR2YWx1ZQ0KaWNjX2x1ZG92aWMuS08ubWFkIDwtIGlycjo6aWNjKDJeTEZRX0tPX2x1ZG92aWMubWFkKSR2YWx1ZQ0KaWNjX2x1ZG92aWMuS08ubG0gPC0gaXJyOjppY2MoMl5MRlFfS09fbHVkb3ZpYy5sbSkkdmFsdWUNCmljY19sdWRvdmljLktPLnZzbiA8LSBpcnI6OmljYygyXkxGUV9LT19sdWRvdmljLnZzbikkdmFsdWUNCmljY19sdWRvdmljLktPLmVpZyA8LSBpcnI6OmljYygyXkxGUV9LT19sdWRvdmljLmVpZ2VuKSR2YWx1ZQ0KDQojIEJpbmQgYWxsIGNhbGN1bGF0ZWQgSUNDcyB0byBhIGRhdGEgZnJhbWUNCmljY19sdWRvdmljLktPLmFsbCA8LSBkYXRhLmZyYW1lKGBJQ0MgS09gPWMoaWNjX2x1ZG92aWMuS08uYmVmb3JlLCBpY2NfbHVkb3ZpYy5LTy5zdGFuZGFyZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2x1ZG92aWMuS08ubWlubWF4LCBpY2NfbHVkb3ZpYy5LTy5tZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NfbHVkb3ZpYy5LTy5tYWQsIGljY19sdWRvdmljLktPLmxtLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2x1ZG92aWMuS08udnNuLCBpY2NfbHVkb3ZpYy5LTy5laWcpKQ0Kcm93bmFtZXMoaWNjX2x1ZG92aWMuS08uYWxsKSA8LSBjKCdCZWZvcmUnLCAnWi1zY29yZScsICdNaW5NYXgnLCAnTWVkaWFuJywgJ01BRCcsICdMaW5lYXInLCANCiAgICAgICAgICAgICAgICAgICAgICAgJ1ZTTicsICdFaWdlbk1TJykNCg0KIyBDYWxjdWxhdGUgSUNDIGZvciBJbXB1dGVkIEtPIGRhdGEgdXNpbmcgbHVkb3ZpYw0KaWNjX2x1ZG92aWMuV1QuYmVmb3JlIDwtIGlycjo6aWNjKDJeTEZRX1dUX2x1ZG92aWMpJHZhbHVlDQppY2NfbHVkb3ZpYy5XVC5zdGFuZGFyZCA8LSBpcnI6OmljYygyXkxGUV9XVF9sdWRvdmljLnN0YW5kYXJkKSR2YWx1ZQ0KaWNjX2x1ZG92aWMuV1QubWlubWF4IDwtIGlycjo6aWNjKDJeTEZRX1dUX2x1ZG92aWMubWlubWF4KSR2YWx1ZQ0KaWNjX2x1ZG92aWMuV1QubWVkIDwtIGlycjo6aWNjKDJeTEZRX1dUX2x1ZG92aWMubWVkKSR2YWx1ZQ0KaWNjX2x1ZG92aWMuV1QubWFkIDwtIGlycjo6aWNjKDJeTEZRX1dUX2x1ZG92aWMubWFkKSR2YWx1ZQ0KaWNjX2x1ZG92aWMuV1QubG0gPC0gaXJyOjppY2MoMl5MRlFfV1RfbHVkb3ZpYy5sbSkkdmFsdWUNCmljY19sdWRvdmljLldULnZzbiA8LSBpcnI6OmljYygyXkxGUV9XVF9sdWRvdmljLnZzbikkdmFsdWUNCmljY19sdWRvdmljLldULmVpZyA8LSBpcnI6OmljYygyXkxGUV9XVF9sdWRvdmljLmVpZ2VuKSR2YWx1ZQ0KDQojIEJpbmQgYWxsIGNhbGN1bGF0ZWQgSUNDcyB0byBhIGRhdGEgZnJhbWUNCmljY19sdWRvdmljLldULmFsbCA8LSBkYXRhLmZyYW1lKGBJQ0MgV1RgPWMoaWNjX2x1ZG92aWMuV1QuYmVmb3JlLCBpY2NfbHVkb3ZpYy5XVC5zdGFuZGFyZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljY19sdWRvdmljLldULm1pbm1heCwgaWNjX2x1ZG92aWMuV1QubWVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2x1ZG92aWMuV1QubWFkLCBpY2NfbHVkb3ZpYy5XVC5sbSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljY19sdWRvdmljLldULnZzbiwgaWNjX2x1ZG92aWMuV1QuZWlnKSkNCnJvd25hbWVzKGljY19sdWRvdmljLldULmFsbCkgPC0gYygnQmVmb3JlJywgJ1otc2NvcmUnLCAnTWluTWF4JywgJ01lZGlhbicsICdNQUQnLCAnTGluZWFyJywgDQogICAgICAgICAgICAgICAgICAgICAgICdWU04nLCAnRWlnZW5NUycpDQoNCiMgU2hvdyB0aGUgdGFibGUgaW4gYSBuaWNlIGZvcm1hdA0KRFQ6OmRhdGF0YWJsZShjYmluZChpY2NfbHVkb3ZpYy5LTy5hbGwsIGljY19sdWRvdmljLldULmFsbCksIA0KICAgICAgICAgICAgICBvcHRpb25zPWxpc3Qoc2VhcmNoaW5nPUZBTFNFLCBwYWdpbmc9RkFMU0UsIGluZm89RkFMU0UpKSB8Pg0KICAgIERUOjpmb3JtYXRTdHlsZShjb2x1bW5zID0gYygnSUNDLktPJywgJ0lDQy5XVCcpLCANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IERUOjpzdHlsZUludGVydmFsKGMoMC41LDAuNzUsMC45KSwgYygnI0QzRDNEMycsICcjYWVmZGExJywgJyM2ZGZmNTQnLCAnIzFiYjQwMCcpKSkNCmBgYA0KDQojIyB0LXRlc3Qgey50YWJzZXR9DQoNCkluIG91ciBwcm9qZWN0IHdlIHVzZWQgdGhlIHBhaXJlZCB0LXRlc3QsIHdoaWNoIGlzIGEgdGVzdCBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZXMNCmJldHdlZW4gdGhlIHZhbHVlcyBvZiBhIHNpbmdsZSBwYWlyLCBpLmUuLCBvbmUgZGVkdWN0ZWQgZnJvbSB0aGUgb3RoZXIuIFRoZSANCmZvcm11bGEgZm9yIHRoZSBwYWlyZWQgdC10ZXN0IGlzIGdpdmVuIGJ5Og0KDQokJHQgPSBcZnJhY3tcc3Vte2R9fXtcc3FydHtcZnJhY3tuKFxzdW17ZF4yfSktKFxzdW17ZH0pXjJ9e24tMX19fSQkDQoNCldoZXJlOg0KDQoqICRkJCBpcyBhIGRpZmZlcmVuY2UgcGVyIHBhaXJlZCB2YWx1ZTsNCiogJG4kIGlzIG51bWJlciBvZiBzYW1wbGVzLg0KDQpJbiBvdXIgY2FsY3VsYXRpb25zLCB3ZSB0ZXN0ZWQgdGhlIGZvbGxvd2luZyBoeXBvdGhlc2lzOg0KDQokSF8wJDogVGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtZWFucyBvZiB0aGUgdHdvIGdyb3Vwcy4gPGJyPg0KJEhfMSQ6IFRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbiBtZWFucy4NCg0KIyMjIFJhdyBEYXRhDQoNCioqU3VtbWFyeSoqIDxicj4NClRoZSBwLXZhbHVlIHBsb3RzIHNob3cgdXMgdGhhdCB3ZSBoYWQgdG8gbm9ybWFsaXplIHRoZSBkYXRhLCBiZWNhdXNlIHRoZSBvdXRwdXQNCmJlbG93IGRvZXNuJ3Qgc2hvdyBzdHJvbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiBLTyBhbmQgV1QgY2VsbHMuDQoNCmBgYHtyIHAtdmFsdWUgcmF3IGRhdGF9DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQpkZiA8LSBsZnENCmRmW2lzLm5hKGRmKV0gPC0gMA0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWUgPC0gZGYgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkoZGYsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhkZikpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhkZikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbiANCm0gPC0gbWVhbihwdmFsdWUkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZSRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3AgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWUsIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ05vbi1JbXB1dGVkIC0gcC52YWx1ZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGltcCBkYXRhfQ0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX2ltcCA8LSBsZnFfaW1wIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KGxmcV9pbXAsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhsZnFfaW1wKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKGxmcV9pbXApKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4gDQptIDwtIG1lYW4ocHZhbHVlX2ltcCRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX2ltcCRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfaW1wIDwtIGdncGxvdChkYXRhID0gcHZhbHVlX2ltcCwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBNYXRpIENvZGUgLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUgUkYgZGF0YX0NCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9SRiA8LSBpbXB1dGVkX1JGIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KGltcHV0ZWRfUkYsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhpbXB1dGVkX1JGKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKGltcHV0ZWRfUkYpKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4gDQptIDwtIG1lYW4ocHZhbHVlX1JGJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfUkYkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX1JGIDwtIGdncGxvdChkYXRhID0gcHZhbHVlX1JGLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIFJGIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGtOTiBkYXRhfQ0KIyBoYW5kbGluZyB3aXRoIGR1cGxpY2F0ZXMNCmR1cGxpY2F0ZXMgPC0gd2hpY2gobGFwcGx5KDE6bnJvdyhpbXB1dGVkX2tOTiksIGZ1bmN0aW9uKGkpIGxlbmd0aCh1bmlxdWUoYXMubnVtZXJpYyhpbXB1dGVkX2tOTltpLF0pKSkpICE9IDYpDQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQpkZl9rTk4gPC0gaW1wdXRlZF9rTk5bLWR1cGxpY2F0ZXMsXQ0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfa05OIDwtIGRmX2tOTiB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseShkZl9rTk4sIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhkZl9rTk4pKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMoZGZfa05OKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uIA0KbSA8LSBtZWFuKHB2YWx1ZV9rTk4kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9rTk4kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX2tOTiA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9rTk4sIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ0ltcHV0ZWQga05OIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGx1ZG92aWMgZGF0YX0NCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9sdWRvdmljIDwtIGltcHV0ZWRfbHVkb3ZpYyB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseShpbXB1dGVkX2x1ZG92aWMsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhpbXB1dGVkX2x1ZG92aWMpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMoaW1wdXRlZF9sdWRvdmljKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uIA0KbSA8LSBtZWFuKHB2YWx1ZV9sdWRvdmljJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfbHVkb3ZpYyRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfbHVkb3ZpYyA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9sdWRvdmljLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIGx1ZG92aWMgLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTV9DQpoaXN0X3ANCmBgYA0KDQpgYGB7cn0NCmdnYXJyYW5nZSgNCiAgICBoaXN0X3BfaW1wLA0KICAgIGhpc3RfcF9SRiwNCiAgICBoaXN0X3Bfa05OLA0KICAgIGhpc3RfcF9sdWRvdmljLA0KICAgIG5yb3c9MixuY29sPTINCikNCmBgYA0KDQojIyMgWi1TY29yZQ0KDQoqKlN1bW1hcnkqKiA8YnI+DQpUaGUgcC12YWx1ZSBwbG90cyBsb29rIHZlcnkgYmFkLCB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmUgbG9zdCB3aG9sZSBkaWZmZXJlbmNlcyANCmJldHdlZW4gdGhlIHNhbXBsZXMuDQoNCmBgYHtyIHAtdmFsdWUgcmF3IGRhdGEgc3RhbmRhcmRpemF0aW9ufQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0Kc3RhbmRhcmRfZGYgPC0gZGF0YS5mcmFtZShMRlFfS08uc3RhbmRhcmQsIExGUV9XVC5zdGFuZGFyZCkNCnN0YW5kYXJkX2RmW2lzLm5hKHN0YW5kYXJkX2RmKV0gPC0gMA0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfc3RhbmRhcmQgPC0gc3RhbmRhcmRfZGYgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkoc3RhbmRhcmRfZGYsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhzdGFuZGFyZF9kZikpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhzdGFuZGFyZF9kZikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbiANCm0gPC0gbWVhbihwdmFsdWVfc3RhbmRhcmQkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9zdGFuZGFyZCRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3Bfc3RhbmRhcmQgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfc3RhbmRhcmQsIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ05vbi1JbXB1dGVkIC0gcC52YWx1ZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGltcHV0ZWQgZGF0YSBzdGFuZGFyZGl6YXRpb259DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQpzdGFuZGFyZF9kZl9pbXAgPC0gZGF0YS5mcmFtZShMRlFfS09faW1wLnN0YW5kYXJkLCBMRlFfV1RfaW1wLnN0YW5kYXJkKQ0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfc3RhbmRhcmRfaW1wIDwtIHN0YW5kYXJkX2RmX2ltcCB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseShzdGFuZGFyZF9kZl9pbXAsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhzdGFuZGFyZF9kZl9pbXApKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMoc3RhbmRhcmRfZGZfaW1wKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uIA0KbSA8LSBtZWFuKHB2YWx1ZV9zdGFuZGFyZF9pbXAkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9zdGFuZGFyZF9pbXAkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX3N0YW5kYXJkX2ltcCA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9zdGFuZGFyZF9pbXAsIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ0ltcHV0ZWQgTWF0aSBDb2RlIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIHJmIGRhdGEgc3RhbmRhcmRpemF0aW9ufQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0Kc3RhbmRhcmRfZGZfUkYgPC0gZGF0YS5mcmFtZShMRlFfS09fUkYuc3RhbmRhcmQsIExGUV9XVF9SRi5zdGFuZGFyZCkNCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX3N0YW5kYXJkX1JGIDwtIHN0YW5kYXJkX2RmX1JGIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KHN0YW5kYXJkX2RmX1JGLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMoc3RhbmRhcmRfZGZfUkYpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMoc3RhbmRhcmRfZGZfUkYpKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4gDQptIDwtIG1lYW4ocHZhbHVlX3N0YW5kYXJkX1JGJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfc3RhbmRhcmRfUkYkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX3N0YW5kYXJkX1JGIDwtIGdncGxvdChkYXRhID0gcHZhbHVlX3N0YW5kYXJkX1JGLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIFJGIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGtOTiBkYXRhIHN0YW5kYXJkaXphdGlvbn0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCnN0YW5kYXJkX2RmX2tOTiA8LSBkYXRhLmZyYW1lKExGUV9LT19rTk4uc3RhbmRhcmQsIExGUV9XVF9rTk4uc3RhbmRhcmQpDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9zdGFuZGFyZF9rTk4gPC0gc3RhbmRhcmRfZGZfa05OIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KHN0YW5kYXJkX2RmX2tOTiwgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKHN0YW5kYXJkX2RmX2tOTikpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhzdGFuZGFyZF9kZl9rTk4pKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4gDQptIDwtIG1lYW4ocHZhbHVlX3N0YW5kYXJkX2tOTiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX3N0YW5kYXJkX2tOTiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3Bfc3RhbmRhcmRfa05OIDwtIGdncGxvdChkYXRhID0gcHZhbHVlX3N0YW5kYXJkX2tOTiwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBrTk4gLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUgbHVkb3ZpYyBkYXRhIHN0YW5kYXJkaXphdGlvbn0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCnN0YW5kYXJkX2RmX2x1ZG92aWMgPC0gZGF0YS5mcmFtZShMRlFfS09fbHVkb3ZpYy5zdGFuZGFyZCwgTEZRX1dUX2x1ZG92aWMuc3RhbmRhcmQpDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9zdGFuZGFyZF9sdWRvdmljIDwtIHN0YW5kYXJkX2RmX2x1ZG92aWMgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkoc3RhbmRhcmRfZGZfbHVkb3ZpYywgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKHN0YW5kYXJkX2RmX2x1ZG92aWMpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMoc3RhbmRhcmRfZGZfbHVkb3ZpYykpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbiANCm0gPC0gbWVhbihwdmFsdWVfc3RhbmRhcmRfbHVkb3ZpYyRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX3N0YW5kYXJkX2x1ZG92aWMkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX3N0YW5kYXJkX2x1ZG92aWMgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfc3RhbmRhcmRfbHVkb3ZpYywgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBsdWRvdmljIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD01fQ0KaGlzdF9wX3N0YW5kYXJkDQpgYGANCg0KYGBge3J9DQpnZ2FycmFuZ2UoDQogICAgaGlzdF9wX3N0YW5kYXJkX2ltcCwNCiAgICBoaXN0X3Bfc3RhbmRhcmRfUkYsDQogICAgaGlzdF9wX3N0YW5kYXJkX2tOTiwNCiAgICBoaXN0X3Bfc3RhbmRhcmRfbHVkb3ZpYywNCiAgICBucm93PTIsbmNvbD0yDQopDQpgYGANCg0KIyMjIE1pbi1NYXgNCg0KKipTdW1tYXJ5KiogPGJyPg0KQWdhaW4gdGhlIHAtdmFsdWUgcGxvdHMgbG9vayB2ZXJ5IGJhZCwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIGFnYWluIGxvc3Qgd2hvbGUgDQpkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBzYW1wbGVzLg0KDQpgYGB7ciBwLXZhbHVlIHJhdyBkYXRhIG1pbm1heH0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCm1pbm1heF9kZiA8LSBkYXRhLmZyYW1lKExGUV9LTy5taW5tYXgsIExGUV9XVC5taW5tYXgpDQptaW5tYXhfZGZbaXMubmEobWlubWF4X2RmKV0gPC0gMA0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfbWlubWF4IDwtIG1pbm1heF9kZiB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseShtaW5tYXhfZGYsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhtaW5tYXhfZGYpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMobWlubWF4X2RmKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uIA0KbSA8LSBtZWFuKHB2YWx1ZV9taW5tYXgkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9taW5tYXgkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX21pbm1heCA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9taW5tYXgsIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ05vbi1JbXB1dGVkIC0gcC52YWx1ZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGltcHV0ZWQgZGF0YSBtaW5tYXh9DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQptaW5tYXhfZGZfaW1wIDwtIGRhdGEuZnJhbWUoTEZRX0tPX2ltcC5taW5tYXgsIExGUV9XVF9pbXAubWlubWF4KQ0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfbWlubWF4X2ltcCA8LSBtaW5tYXhfZGZfaW1wIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KG1pbm1heF9kZl9pbXAsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhtaW5tYXhfZGZfaW1wKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKG1pbm1heF9kZl9pbXApKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4gDQptIDwtIG1lYW4ocHZhbHVlX21pbm1heF9pbXAkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9taW5tYXhfaW1wJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWRpYW4gb2YgcA0KDQojIFBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHAtdmFsdWVzIGZpbGxlZCB3aXRoIGEgc2lnbmlmaWNhbmNlIGluZm8NCmhpc3RfcF9taW5tYXhfaW1wIDwtIGdncGxvdChkYXRhID0gcHZhbHVlX21pbm1heF9pbXAsIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ0ltcHV0ZWQgTWF0aSBDb2RlIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIHJmIGRhdGEgbWlubWF4fQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0KbWlubWF4X2RmX1JGIDwtIGRhdGEuZnJhbWUoTEZRX0tPX1JGLm1pbm1heCwgTEZRX1dUX1JGLm1pbm1heCkNCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX21pbm1heF9SRiA8LSBtaW5tYXhfZGZfUkYgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkobWlubWF4X2RmX1JGLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMobWlubWF4X2RmX1JGKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKG1pbm1heF9kZl9SRikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbiANCm0gPC0gbWVhbihwdmFsdWVfbWlubWF4X1JGJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfbWlubWF4X1JGJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWRpYW4gb2YgcA0KDQojIFBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHAtdmFsdWVzIGZpbGxlZCB3aXRoIGEgc2lnbmlmaWNhbmNlIGluZm8NCmhpc3RfcF9taW5tYXhfUkYgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfbWlubWF4X1JGLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIFJGIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGtOTiBkYXRhIG1pbm1heH0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCm1pbm1heF9kZl9rTk4gPC0gZGF0YS5mcmFtZShMRlFfS09fa05OLm1pbm1heCwgTEZRX1dUX2tOTi5taW5tYXgpDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9taW5tYXhfa05OIDwtIG1pbm1heF9kZl9rTk4gfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkobWlubWF4X2RmX2tOTiwgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKG1pbm1heF9kZl9rTk4pKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMobWlubWF4X2RmX2tOTikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbiANCm0gPC0gbWVhbihwdmFsdWVfbWlubWF4X2tOTiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX21pbm1heF9rTk4kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX21pbm1heF9rTk4gPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfbWlubWF4X2tOTiwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBrTk4gLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUgbHVkb3ZpYyBkYXRhIG1pbm1heH0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCm1pbm1heF9kZl9sdWRvdmljIDwtIGRhdGEuZnJhbWUoTEZRX0tPX2x1ZG92aWMubWlubWF4LCBMRlFfV1RfbHVkb3ZpYy5taW5tYXgpDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9taW5tYXhfbHVkb3ZpYyA8LSBtaW5tYXhfZGZfbHVkb3ZpYyB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseShtaW5tYXhfZGZfbHVkb3ZpYywgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKG1pbm1heF9kZl9sdWRvdmljKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKG1pbm1heF9kZl9sdWRvdmljKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uIA0KbSA8LSBtZWFuKHB2YWx1ZV9taW5tYXhfbHVkb3ZpYyRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX21pbm1heF9sdWRvdmljJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWRpYW4gb2YgcA0KDQojIFBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHAtdmFsdWVzIGZpbGxlZCB3aXRoIGEgc2lnbmlmaWNhbmNlIGluZm8NCmhpc3RfcF9taW5tYXhfbHVkb3ZpYyA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9taW5tYXhfbHVkb3ZpYywgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBsdWRvdmljIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD01fQ0KaGlzdF9wX21pbm1heA0KYGBgDQoNCmBgYHtyfQ0KZ2dhcnJhbmdlKA0KICAgIGhpc3RfcF9taW5tYXhfaW1wLA0KICAgIGhpc3RfcF9taW5tYXhfUkYsDQogICAgaGlzdF9wX21pbm1heF9rTk4sDQogICAgaGlzdF9wX21pbm1heF9sdWRvdmljLA0KICAgIG5yb3c9MixuY29sPTINCikNCmBgYA0KDQojIyMgTWVkaWFuIFNjYWxpbmcNCg0KKipTdW1tYXJ5Kio8YnI+DQpBZ2FpbiB0aGUgcC12YWx1ZSBwbG90cyBsb29rIHZlcnkgYmFkLCB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmUgYWdhaW4gbG9zdCB3aG9sZSANCmRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHNhbXBsZXMuDQoNCmBgYHtyIHAtdmFsdWUgcmF3IGRhdGEgbWVkaWFufQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0KbWVkX2RmIDwtIGRhdGEuZnJhbWUoTEZRX0tPLm1lZCwgTEZRX1dULm1lZCkNCm1lZF9kZltpcy5uYShtZWRfZGYpXSA8LSAwDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9tZWQgPC0gbWVkX2RmIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KG1lZF9kZiwgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKG1lZF9kZikpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhtZWRfZGYpKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4gDQptIDwtIG1lYW4ocHZhbHVlX21lZCRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX21lZCRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfbWVkIDwtIGdncGxvdChkYXRhID0gcHZhbHVlX21lZCwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnTm9uLUltcHV0ZWQgLSBwLnZhbHVlJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gNCwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUgaW1wdXRlZCBkYXRhIG1lZGlhbn0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCm1lZF9kZl9pbXAgPC0gZGF0YS5mcmFtZShMRlFfS09faW1wLm1lZCwgTEZRX1dUX2ltcC5tZWQpDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9tZWRfaW1wIDwtIG1lZF9kZl9pbXAgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkobWVkX2RmX2ltcCwgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKG1lZF9kZl9pbXApKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMobWVkX2RmX2ltcCkpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbiANCm0gPC0gbWVhbihwdmFsdWVfbWVkX2ltcCRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX21lZF9pbXAkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX21lZF9pbXAgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfbWVkX2ltcCwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBNYXRpIENvZGUgLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUgcmYgZGF0YSBtZWRpYW59DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQptZWRfZGZfUkYgPC0gZGF0YS5mcmFtZShMRlFfS09fUkYubWVkLCBMRlFfV1RfUkYubWVkKQ0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfbWVkX1JGIDwtIG1lZF9kZl9SRiB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseShtZWRfZGZfUkYsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhtZWRfZGZfUkYpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMobWVkX2RmX1JGKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uIA0KbSA8LSBtZWFuKHB2YWx1ZV9tZWRfUkYkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9tZWRfUkYkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX21lZF9SRiA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9tZWRfUkYsIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ0ltcHV0ZWQgUkYgLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUga05OIGRhdGEgbWVkaWFufQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0KbWVkX2RmX2tOTiA8LSBkYXRhLmZyYW1lKExGUV9LT19rTk4ubWVkLCBMRlFfV1Rfa05OLm1lZCkNCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX21lZF9rTk4gPC0gbWVkX2RmX2tOTiB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseShtZWRfZGZfa05OLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMobWVkX2RmX2tOTikpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhtZWRfZGZfa05OKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uIA0KbSA8LSBtZWFuKHB2YWx1ZV9tZWRfa05OJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfbWVkX2tOTiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfbWVkX2tOTiA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9tZWRfa05OLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIGtOTiAtIHAudmFsdWUnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gMy41LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KYGBge3IgcC12YWx1ZSBsdWRvdmljIGRhdGEgbWVkaWFufQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0KbWVkX2RmX2x1ZG92aWMgPC0gZGF0YS5mcmFtZShMRlFfS09fbHVkb3ZpYy5tZWQsIExGUV9XVF9sdWRvdmljLm1lZCkNCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX21lZF9sdWRvdmljIDwtIG1lZF9kZl9sdWRvdmljIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KG1lZF9kZl9sdWRvdmljLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMobWVkX2RmX2x1ZG92aWMpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMobWVkX2RmX2x1ZG92aWMpKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4gDQptIDwtIG1lYW4ocHZhbHVlX21lZF9sdWRvdmljJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfbWVkX2x1ZG92aWMkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX21lZF9sdWRvdmljIDwtIGdncGxvdChkYXRhID0gcHZhbHVlX21lZF9sdWRvdmljLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIGx1ZG92aWMgLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTV9DQpoaXN0X3BfbWVkDQpgYGANCg0KYGBge3J9DQpnZ2FycmFuZ2UoDQogICAgaGlzdF9wX21lZF9pbXAsDQogICAgaGlzdF9wX21lZF9SRiwNCiAgICBoaXN0X3BfbWVkX2tOTiwNCiAgICBoaXN0X3BfbWVkX2x1ZG92aWMsDQogICAgbnJvdz0yLG5jb2w9Mg0KKQ0KYGBgDQoNCiMjIyBNYWQgU2NhbGluZw0KDQoqKlN1bW1hcnkqKjxicj4NCkFnYWluIHRoZSBwLXZhbHVlIHBsb3RzIGxvb2sgdmVyeSBiYWQsIHdoaWNoIG1lYW5zIHRoYXQgd2UgaGF2ZSBhZ2FpbiBsb3N0IHdob2xlIA0KZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgc2FtcGxlcy4NCg0KYGBge3IgcC12YWx1ZSByYXcgZGF0YSBtYWR9DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQptYWRfZGYgPC0gZGF0YS5mcmFtZShMRlFfS08ubWFkLCBMRlFfV1QubWFkKQ0KbWFkX2RmW2lzLm5hKG1hZF9kZildIDwtIDANCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX21hZCA8LSBtYWRfZGYgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkobWFkX2RmLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMobWFkX2RmKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKG1hZF9kZikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbiANCm0gPC0gbWVhbihwdmFsdWVfbWFkJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfbWFkJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWRpYW4gb2YgcA0KDQojIFBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHAtdmFsdWVzIGZpbGxlZCB3aXRoIGEgc2lnbmlmaWNhbmNlIGluZm8NCmhpc3RfcF9tYWQgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfbWFkLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdOb24tSW1wdXRlZCAtIHAudmFsdWUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSA0LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KYGBge3IgcC12YWx1ZSBpbXB1dGVkIGRhdGEgbWFkfQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0KbWFkX2RmX2ltcCA8LSBkYXRhLmZyYW1lKExGUV9LT19pbXAubWFkLCBMRlFfV1RfaW1wLm1hZCkNCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX21hZF9pbXAgPC0gbWFkX2RmX2ltcCB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseShtYWRfZGZfaW1wLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMobWFkX2RmX2ltcCkpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhtYWRfZGZfaW1wKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uIA0KbSA8LSBtZWFuKHB2YWx1ZV9tYWRfaW1wJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfbWFkX2ltcCRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfbWFkX2ltcCA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9tYWRfaW1wLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIE1hdGkgQ29kZSAtIHAudmFsdWUnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gMy41LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KYGBge3IgcC12YWx1ZSByZiBkYXRhIG1hZH0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCm1hZF9kZl9SRiA8LSBkYXRhLmZyYW1lKExGUV9LT19SRi5tYWQsIExGUV9XVF9SRi5tYWQpDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9tYWRfUkYgPC0gbWFkX2RmX1JGIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KG1hZF9kZl9SRiwgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKG1hZF9kZl9SRikpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhtYWRfZGZfUkYpKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4NCm0gPC0gbWVhbihwdmFsdWVfbWFkX1JGJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfbWFkX1JGJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWRpYW4gb2YgcA0KDQojIFBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHAtdmFsdWVzIGZpbGxlZCB3aXRoIGEgc2lnbmlmaWNhbmNlIGluZm8NCmhpc3RfcF9tYWRfUkYgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfbWFkX1JGLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIFJGIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGtOTiBkYXRhIG1hZH0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCm1hZF9kZl9rTk4gPC0gZGF0YS5mcmFtZShMRlFfS09fa05OLm1hZCwgTEZRX1dUX2tOTi5tYWQpDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9tYWRfa05OIDwtIG1hZF9kZl9rTk4gfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkobWFkX2RmX2tOTiwgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKG1hZF9kZl9rTk4pKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMobWFkX2RmX2tOTikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbg0KbSA8LSBtZWFuKHB2YWx1ZV9tYWRfa05OJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfbWFkX2tOTiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfbWFkX2tOTiA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9tYWRfa05OLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIGtOTiAtIHAudmFsdWUnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gMy41LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KYGBge3IgcC12YWx1ZSBsdWRvdmljIGRhdGEgbWFkfQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0KbWFkX2RmX2x1ZG92aWMgPC0gZGF0YS5mcmFtZShMRlFfS09fbHVkb3ZpYy5tYWQsIExGUV9XVF9sdWRvdmljLm1hZCkNCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX21hZF9sdWRvdmljIDwtIG1hZF9kZl9sdWRvdmljIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KG1hZF9kZl9sdWRvdmljLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMobWFkX2RmX2x1ZG92aWMpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMobWFkX2RmX2x1ZG92aWMpKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4NCm0gPC0gbWVhbihwdmFsdWVfbWFkX2x1ZG92aWMkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9tYWRfbHVkb3ZpYyRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfbWFkX2x1ZG92aWMgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfbWFkX2x1ZG92aWMsIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ0ltcHV0ZWQgbHVkb3ZpYyAtIHAudmFsdWUnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gMy41LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KYGBge3IgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NX0NCmhpc3RfcF9tYWQNCmBgYA0KDQpgYGB7cn0NCmdnYXJyYW5nZSgNCiAgICBoaXN0X3BfbWFkX2ltcCwNCiAgICBoaXN0X3BfbWFkX1JGLA0KICAgIGhpc3RfcF9tYWRfa05OLA0KICAgIGhpc3RfcF9tYWRfbHVkb3ZpYywNCiAgICBucm93PTIsbmNvbD0yDQopDQpgYGANCg0KIyMjIExpbmVhciBSZWdyZXNzaW9uDQoNCioqU3VtbWFyeSoqPGJyPg0KQWdhaW4gdGhlIHAtdmFsdWUgcGxvdHMgbG9vayB2ZXJ5IGJhZCwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIGFnYWluIGxvc3Qgd2hvbGUgDQpkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBzYW1wbGVzLg0KDQpgYGB7ciBwLXZhbHVlIHJhdyBkYXRhIGxtfQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0KbG1fZGYgPC0gZGF0YS5mcmFtZShMRlFfS08ubG0sIExGUV9XVC5sbSkNCmxtX2RmW2lzLm5hKGxtX2RmKV0gPC0gMA0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfbG0gPC0gbG1fZGYgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkobG1fZGYsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhsbV9kZikpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhsbV9kZikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbg0KbSA8LSBtZWFuKHB2YWx1ZV9sbSRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX2xtJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWRpYW4gb2YgcA0KDQojIFBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHAtdmFsdWVzIGZpbGxlZCB3aXRoIGEgc2lnbmlmaWNhbmNlIGluZm8NCmhpc3RfcF9sbSA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9sbSwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnTm9uLUltcHV0ZWQgLSBwLnZhbHVlJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gNCwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUgaW1wdXRlZCBkYXRhIGxtfQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0KbG1fZGZfaW1wIDwtIGRhdGEuZnJhbWUoTEZRX0tPX2ltcC5sbSwgTEZRX1dUX2ltcC5sbSkNCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX2xtX2ltcCA8LSBsbV9kZl9pbXAgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkobG1fZGZfaW1wLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMobG1fZGZfaW1wKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKGxtX2RmX2ltcCkpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbg0KbSA8LSBtZWFuKHB2YWx1ZV9sbV9pbXAkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9sbV9pbXAkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX2xtX2ltcCA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9sbV9pbXAsIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ0ltcHV0ZWQgTWF0aSBDb2RlIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIHJmIGRhdGEgbG19DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQpsbV9kZl9SRiA8LSBkYXRhLmZyYW1lKExGUV9LT19SRi5sbSwgTEZRX1dUX1JGLmxtKQ0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfbG1fUkYgPC0gbG1fZGZfUkYgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkobG1fZGZfUkYsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhsbV9kZl9SRikpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhsbV9kZl9SRikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbg0KbSA8LSBtZWFuKHB2YWx1ZV9sbV9SRiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX2xtX1JGJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWRpYW4gb2YgcA0KDQojIFBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHAtdmFsdWVzIGZpbGxlZCB3aXRoIGEgc2lnbmlmaWNhbmNlIGluZm8NCmhpc3RfcF9sbV9SRiA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9sbV9SRiwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBSRiAtIHAudmFsdWUnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gMy41LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KYGBge3IgcC12YWx1ZSBrTk4gZGF0YSBsbX0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCmxtX2RmX2tOTiA8LSBkYXRhLmZyYW1lKExGUV9LT19rTk4ubG0sIExGUV9XVF9rTk4ubG0pDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9sbV9rTk4gPC0gbG1fZGZfa05OIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KGxtX2RmX2tOTiwgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKGxtX2RmX2tOTikpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhsbV9kZl9rTk4pKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4NCm0gPC0gbWVhbihwdmFsdWVfbG1fa05OJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfbG1fa05OJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWRpYW4gb2YgcA0KDQojIFBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHAtdmFsdWVzIGZpbGxlZCB3aXRoIGEgc2lnbmlmaWNhbmNlIGluZm8NCmhpc3RfcF9sbV9rTk4gPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfbG1fa05OLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIGtOTiAtIHAudmFsdWUnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gMy41LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KYGBge3IgcC12YWx1ZSBsdWRvdmljIGRhdGEgbG19DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQpsbV9kZl9sdWRvdmljIDwtIGRhdGEuZnJhbWUoTEZRX0tPX2x1ZG92aWMubG0sIExGUV9XVF9sdWRvdmljLmxtKQ0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfbG1fbHVkb3ZpYyA8LSBsbV9kZl9sdWRvdmljIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KGxtX2RmX2x1ZG92aWMsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyhsbV9kZl9sdWRvdmljKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKGxtX2RmX2x1ZG92aWMpKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4NCm0gPC0gbWVhbihwdmFsdWVfbG1fbHVkb3ZpYyRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX2xtX2x1ZG92aWMkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX2xtX2x1ZG92aWMgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfbG1fbHVkb3ZpYywgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBsdWRvdmljIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD01fQ0KaGlzdF9wX2xtDQpgYGANCg0KYGBge3J9DQpnZ2FycmFuZ2UoDQogICAgaGlzdF9wX2xtX2ltcCwNCiAgICBoaXN0X3BfbG1fUkYsDQogICAgaGlzdF9wX2xtX2tOTiwNCiAgICBoaXN0X3BfbG1fbHVkb3ZpYywNCiAgICBucm93PTIsbmNvbD0yDQopDQpgYGANCg0KIyMjIFZTTg0KDQoqKlN1bW1hcnkqKjxicj4NCkFnYWluIHRoZSBwLXZhbHVlIHBsb3RzIGxvb2sgdmVyeSBiYWQsIHdoaWNoIG1lYW5zIHRoYXQgd2UgaGF2ZSBhZ2FpbiBsb3N0IHdob2xlIA0KZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgc2FtcGxlcy4NCg0KYGBge3IgcC12YWx1ZSByYXcgZGF0YSB2c259DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQp2c25fZGYgPC0gZGF0YS5mcmFtZShMRlFfS08udnNuLCBMRlFfV1QudnNuKQ0KdnNuX2RmW2lzLm5hKHZzbl9kZildIDwtIDANCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX3ZzbiA8LSB2c25fZGYgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkodnNuX2RmLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXModnNuX2RmKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKHZzbl9kZikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbg0KbSA8LSBtZWFuKHB2YWx1ZV92c24kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV92c24kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX3ZzbiA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV92c24sIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ05vbi1JbXB1dGVkIC0gcC52YWx1ZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGltcHV0ZWQgZGF0YSB2c259DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQp2c25fZGZfaW1wIDwtIGRhdGEuZnJhbWUoTEZRX0tPX2ltcC52c24sIExGUV9XVF9pbXAudnNuKQ0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfdnNuX2ltcCA8LSB2c25fZGZfaW1wIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KHZzbl9kZl9pbXAsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyh2c25fZGZfaW1wKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKHZzbl9kZl9pbXApKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4NCm0gPC0gbWVhbihwdmFsdWVfdnNuX2ltcCRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX3Zzbl9pbXAkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX3Zzbl9pbXAgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfdnNuX2ltcCwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBNYXRpIENvZGUgLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUgcmYgZGF0YSB2c259DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQp2c25fZGZfUkYgPC0gZGF0YS5mcmFtZShMRlFfS09fUkYudnNuLCBMRlFfV1RfUkYudnNuKQ0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfdnNuX1JGIDwtIHZzbl9kZl9SRiB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseSh2c25fZGZfUkYsIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyh2c25fZGZfUkYpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXModnNuX2RmX1JGKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uDQptIDwtIG1lYW4ocHZhbHVlX3Zzbl9SRiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX3Zzbl9SRiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfdnNuX1JGIDwtIGdncGxvdChkYXRhID0gcHZhbHVlX3Zzbl9SRiwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBSRiAtIHAudmFsdWUnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gMy41LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KYGBge3IgcC12YWx1ZSBrTk4gZGF0YSB2c259DQojIHByZXBhcmUgZGF0YSBmb3IgdC10ZXN0DQp2c25fZGZfa05OIDwtIGRhdGEuZnJhbWUoTEZRX0tPX2tOTi52c24sIExGUV9XVF9rTk4udnNuKQ0KDQojIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZXMgZm9yIG91ciBkYXRhDQpwdmFsdWVfdnNuX2tOTiA8LSB2c25fZGZfa05OIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KHZzbl9kZl9rTk4sIDEsIHR0ZXN0LCANCiAgICAgICAgICAgICAgICAgIGdycDE9Z3JlcCgiS08iLCBjb2xuYW1lcyh2c25fZGZfa05OKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKHZzbl9kZl9rTk4pKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4NCm0gPC0gbWVhbihwdmFsdWVfdnNuX2tOTiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVhbiBvZiBwDQptZSA8LSBtZWRpYW4ocHZhbHVlX3Zzbl9rTk4kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX3Zzbl9rTk4gPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfdnNuX2tOTiwgYWVzKHggPSBwX09DSUFEMV9UT1RBTFMsIGZpbGw9c2lnbmlmaWNhbnQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApICsgZ2d0aXRsZSgnSW1wdXRlZCBrTk4gLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUgbHVkb3ZpYyBkYXRhIHZzbn0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCnZzbl9kZl9sdWRvdmljIDwtIGRhdGEuZnJhbWUoTEZRX0tPX2x1ZG92aWMudnNuLCBMRlFfV1RfbHVkb3ZpYy52c24pDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV92c25fbHVkb3ZpYyA8LSB2c25fZGZfbHVkb3ZpYyB8Pg0KICAgIGRwbHlyOjptdXRhdGUoInBfT0NJQUQxX1RPVEFMUyIgPSBhcHBseSh2c25fZGZfbHVkb3ZpYywgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKHZzbl9kZl9sdWRvdmljKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKHZzbl9kZl9sdWRvdmljKSkpKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UocF9PQ0lBRDFfVE9UQUxTIDwgcC5jdXRvZmYsIFRSVUUsIEZBTFNFKSkgIyBhZGQgYSBzaWduaWZpY2FuY2UgY29sdW1uDQptIDwtIG1lYW4ocHZhbHVlX3Zzbl9sdWRvdmljJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfdnNuX2x1ZG92aWMkcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX3Zzbl9sdWRvdmljIDwtIGdncGxvdChkYXRhID0gcHZhbHVlX3Zzbl9sdWRvdmljLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIGx1ZG92aWMgLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTV9DQpoaXN0X3BfdnNuDQpgYGANCg0KYGBge3J9DQpnZ2FycmFuZ2UoDQogICAgaGlzdF9wX3Zzbl9pbXAsDQogICAgaGlzdF9wX3Zzbl9SRiwNCiAgICBoaXN0X3BfdnNuX2tOTiwNCiAgICBoaXN0X3BfdnNuX2x1ZG92aWMsDQogICAgbnJvdz0yLG5jb2w9Mg0KKQ0KYGBgDQoNCiMjIyBFaWdlbk1TDQoNCioqU3VtbWFyeSoqPGJyPg0KRmluYWxseSwgd2UgaGF2ZSB0aGUgZXhwZWN0ZWQgcC12YWx1ZSBwbG90cywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgRWlnZW5NUyBtZXRob2QgDQphZ2FpbiBoYXMgdGhlIGJlc3QgcmVzdWx0cy4NCg0KYGBge3IgcC12YWx1ZSByYXcgZGF0YSBlaWdlbn0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCmVpZ2VuX2RmIDwtIGRhdGEuZnJhbWUoTEZRX0tPLmVpZ2VuLCBMRlFfV1QuZWlnZW4pDQplaWdlbl9kZltpcy5uYShlaWdlbl9kZildIDwtIDANCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX2VpZ2VuIDwtIGVpZ2VuX2RmIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KGVpZ2VuX2RmLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMoZWlnZW5fZGYpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMoZWlnZW5fZGYpKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4NCm0gPC0gbWVhbihwdmFsdWVfZWlnZW4kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9laWdlbiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfZWlnZW4gPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfZWlnZW4sIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ05vbi1JbXB1dGVkIC0gcC52YWx1ZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGltcHV0ZWQgZGF0YSBlaWdlbn0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCmVpZ2VuX2RmX2ltcCA8LSBkYXRhLmZyYW1lKExGUV9LT19pbXAuZWlnZW4sIExGUV9XVF9pbXAuZWlnZW4pDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9laWdlbl9pbXAgPC0gZWlnZW5fZGZfaW1wIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KGVpZ2VuX2RmX2ltcCwgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKGVpZ2VuX2RmX2ltcCkpLCANCiAgICAgICAgICAgICAgICAgIGdycDI9Z3JlcCgiV1QiLCBjb2xuYW1lcyhlaWdlbl9kZl9pbXApKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4NCm0gPC0gbWVhbihwdmFsdWVfZWlnZW5faW1wJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfZWlnZW5faW1wJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWRpYW4gb2YgcA0KDQojIFBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHAtdmFsdWVzIGZpbGxlZCB3aXRoIGEgc2lnbmlmaWNhbmNlIGluZm8NCmhpc3RfcF9laWdlbl9pbXAgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfZWlnZW5faW1wLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIE1hdGkgQ29kZSAtIHAudmFsdWUnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IEluZiwgbGFiZWwgPSBwYXN0ZSgizrwocCkgPSIsIHJvdW5kKG0sIDMpLCAnXG5tZWQocCkgPScsIHJvdW5kKG1lLDMpKSwgDQogICAgICAgICAgICAgaGp1c3QgPSAxLjEsIHZqdXN0ID0gMS4zLCBzaXplID0gMy41LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KYGBge3IgcC12YWx1ZSByZiBkYXRhIGVpZ2VufQ0KIyBwcmVwYXJlIGRhdGEgZm9yIHQtdGVzdA0KZWlnZW5fZGZfUkYgPC0gZGF0YS5mcmFtZShMRlFfS09fUkYuZWlnZW4sIExGUV9XVF9SRi5laWdlbikNCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX2VpZ2VuX1JGIDwtIGVpZ2VuX2RmX1JGIHw+DQogICAgZHBseXI6Om11dGF0ZSgicF9PQ0lBRDFfVE9UQUxTIiA9IGFwcGx5KGVpZ2VuX2RmX1JGLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMoZWlnZW5fZGZfUkYpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMoZWlnZW5fZGZfUkYpKSkpIHw+DQogICAgZHBseXI6Om11dGF0ZShzaWduaWZpY2FudCA9IGlmZWxzZShwX09DSUFEMV9UT1RBTFMgPCBwLmN1dG9mZiwgVFJVRSwgRkFMU0UpKSAjIGFkZCBhIHNpZ25pZmljYW5jZSBjb2x1bW4NCm0gPC0gbWVhbihwdmFsdWVfZWlnZW4kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9laWdlbiRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfZWlnZW5fUkYgPC0gZ2dwbG90KGRhdGEgPSBwdmFsdWVfZWlnZW5fUkYsIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ0ltcHV0ZWQgUkYgLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIHAtdmFsdWUga05OIGRhdGEgZWlnZW59DQojIFRoZSBrTk4gbWV0aG9kIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggaW1wdXRhdGlvbi4gSW4gYSBmZXcgcm93cyANCiMgd2UgZGlkbid0IGhhdmUgYSB1bmlxdWUgdmFsdWUgZm9yIGVhY2ggc2FtcGxlLiBTb21ldGltZXMgdGhlcmUgd2FzIG9ubHkgb25lIA0KIyB2YWx1ZSBmb3IgYWxsIGNvbHVtbnMgYW5kIHNvbWV0aW1lcyB0aGVyZSB3ZXJlIHR3byB2YWx1ZXMsIG9uZSBmb3IgS08gYW5kIHRoZSANCiMgb3RoZXIgZm9yIFdULiBUaGF0J3Mgd2h5IHdlIGhhZCB0byByZW1vdmUgZHVwbGljYXRlcyBmcm9tIGRhdGEuDQoNCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCmVpZ2VuX2RmX2tOTiA8LSBkYXRhLmZyYW1lKExGUV9LT19rTk4uZWlnZW4sIExGUV9XVF9rTk4uZWlnZW4pDQoNCiMgaGFuZGxpbmcgd2l0aCBkdXBsaWNhdGVzDQpkdXBsaWNhdGVzIDwtIHdoaWNoKGxhcHBseSgxOm5yb3coZWlnZW5fZGZfa05OKSwgZnVuY3Rpb24oaSkgbGVuZ3RoKHVuaXF1ZShhcy5udW1lcmljKGVpZ2VuX2RmX2tOTltpLF0pKSkpICE9IDYpDQplaWdlbl9kZl9rTk4gPC0gZWlnZW5fZGZfa05OWy1kdXBsaWNhdGVzLF0NCg0KIyBjYWxjdWxhdGUgdGhlIHAtdmFsdWVzIGZvciBvdXIgZGF0YQ0KcHZhbHVlX2VpZ2VuX2tOTiA8LSBlaWdlbl9kZl9rTk4gfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkoZWlnZW5fZGZfa05OLCAxLCB0dGVzdCwgDQogICAgICAgICAgICAgICAgICBncnAxPWdyZXAoIktPIiwgY29sbmFtZXMoZWlnZW5fZGZfa05OKSksIA0KICAgICAgICAgICAgICAgICAgZ3JwMj1ncmVwKCJXVCIsIGNvbG5hbWVzKGVpZ2VuX2RmX2tOTikpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbg0KbSA8LSBtZWFuKHB2YWx1ZV9laWdlbl9rTk4kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lYW4gb2YgcA0KbWUgPC0gbWVkaWFuKHB2YWx1ZV9laWdlbl9rTk4kcF9PQ0lBRDFfVE9UQUxTLCBuYS5ybT1UUlVFKSAjIG1lZGlhbiBvZiBwDQoNCiMgUGxvdHRpbmcgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcC12YWx1ZXMgZmlsbGVkIHdpdGggYSBzaWduaWZpY2FuY2UgaW5mbw0KaGlzdF9wX2VpZ2VuX2tOTiA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9laWdlbl9rTk4sIGFlcyh4ID0gcF9PQ0lBRDFfVE9UQUxTLCBmaWxsPXNpZ25pZmljYW50KSkgKyANCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArIGdndGl0bGUoJ0ltcHV0ZWQga05OIC0gcC52YWx1ZScpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gSW5mLCBsYWJlbCA9IHBhc3RlKCLOvChwKSA9Iiwgcm91bmQobSwgMyksICdcbm1lZChwKSA9Jywgcm91bmQobWUsMykpLCANCiAgICAgICAgICAgICBoanVzdCA9IDEuMSwgdmp1c3QgPSAxLjMsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQpgYGB7ciBwLXZhbHVlIGx1ZG92aWMgZGF0YSBlaWdlbn0NCiMgcHJlcGFyZSBkYXRhIGZvciB0LXRlc3QNCmVpZ2VuX2RmX2x1ZG92aWMgPC0gZGF0YS5mcmFtZShMRlFfS09fbHVkb3ZpYy5laWdlbiwgTEZRX1dUX2x1ZG92aWMuZWlnZW4pDQoNCiMgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyBmb3Igb3VyIGRhdGENCnB2YWx1ZV9laWdlbl9sdWRvdmljIDwtIGVpZ2VuX2RmX2x1ZG92aWMgfD4NCiAgICBkcGx5cjo6bXV0YXRlKCJwX09DSUFEMV9UT1RBTFMiID0gYXBwbHkoZWlnZW5fZGZfbHVkb3ZpYywgMSwgdHRlc3QsIA0KICAgICAgICAgICAgICAgICAgZ3JwMT1ncmVwKCJLTyIsIGNvbG5hbWVzKGVpZ2VuX2RmX2x1ZG92aWMpKSwgDQogICAgICAgICAgICAgICAgICBncnAyPWdyZXAoIldUIiwgY29sbmFtZXMoZWlnZW5fZGZfbHVkb3ZpYykpKSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHBfT0NJQUQxX1RPVEFMUyA8IHAuY3V0b2ZmLCBUUlVFLCBGQUxTRSkpICMgYWRkIGEgc2lnbmlmaWNhbmNlIGNvbHVtbg0KbSA8LSBtZWFuKHB2YWx1ZV9laWdlbl9sdWRvdmljJHBfT0NJQUQxX1RPVEFMUywgbmEucm09VFJVRSkgIyBtZWFuIG9mIHANCm1lIDwtIG1lZGlhbihwdmFsdWVfZWlnZW5fbHVkb3ZpYyRwX09DSUFEMV9UT1RBTFMsIG5hLnJtPVRSVUUpICMgbWVkaWFuIG9mIHANCg0KIyBQbG90dGluZyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBwLXZhbHVlcyBmaWxsZWQgd2l0aCBhIHNpZ25pZmljYW5jZSBpbmZvDQpoaXN0X3BfZWlnZW5fbHVkb3ZpYyA8LSBnZ3Bsb3QoZGF0YSA9IHB2YWx1ZV9laWdlbl9sdWRvdmljLCBhZXMoeCA9IHBfT0NJQUQxX1RPVEFMUywgZmlsbD1zaWduaWZpY2FudCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKyBnZ3RpdGxlKCdJbXB1dGVkIGx1ZG92aWMgLSBwLnZhbHVlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBJbmYsIGxhYmVsID0gcGFzdGUoIs68KHApID0iLCByb3VuZChtLCAzKSwgJ1xubWVkKHApID0nLCByb3VuZChtZSwzKSksIA0KICAgICAgICAgICAgIGhqdXN0ID0gMS4xLCB2anVzdCA9IDEuMywgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQoNCmBgYHtyIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTV9DQpoaXN0X3BfZWlnZW4NCmBgYA0KDQpgYGB7cn0NCmdnYXJyYW5nZSgNCiAgICBoaXN0X3BfZWlnZW5faW1wLA0KICAgIGhpc3RfcF9laWdlbl9SRiwNCiAgICBoaXN0X3BfZWlnZW5fa05OLA0KICAgIGhpc3RfcF9laWdlbl9sdWRvdmljLA0KICAgIG5yb3c9MixuY29sPTINCikNCmBgYA0KDQojIEZvbGQgQ2hhbmdlDQoNCiMjIFJhdyBEYXRhIHsudGFic2V0fQ0KDQojIyMgTm9uLUltcHV0ZWQNCg0KYGBge3IgZmMgcmF3IGRhdGF9DQojIFByZXBhcmluZyBkYXRhIGZvciBjYWxjdWxhdGlvbnMNCmxmcSA8LSBjYmluZC5kYXRhLmZyYW1lKGxmcSwgcHJvdGVpbi5pZHM9cHJvdGVpbi5ncm91cHMkYFByb3RlaW4gSURzYCkNCmxmcV9sb25nIDwtIGxmcSB8Pg0KICAgIHRpZHlyOjpwaXZvdF9sb25nZXIoMTo2LCBuYW1lc190byA9ICdzYW1wbGUnLCB2YWx1ZXNfdG8gPSAnTEZRdmFsdWUnKQ0KDQojIEFkZCBhIG5ldyBjb2x1bW4gd2l0aCBncm91cHMgS08gb3IgV1QNCmxmcV9sb25nJGdyb3VwIDwtICdUT1RBTFNfT0NJQUQxX0tPJw0KbGZxX2xvbmckZ3JvdXBbZ3JlcCgnV1QnLGxmcV9sb25nJHNhbXBsZSldIDwtICdUT1RBTFNfT0NJQUQxX1dUJw0KDQojIENhbGN1bGF0aW9uIG9mIG1lYW5zIGZvciBncm91cHMgS08gYW5kIFdUDQptZWFucyA8LSBsZnFfbG9uZyB8Pg0KICBkcGx5cjo6Z3JvdXBfYnkoZ3JvdXAsIHByb3RlaW4uaWRzKSB8Pg0KICBkcGx5cjo6c3VtbWFyaXNlKG1lYW49bWVhbihMRlF2YWx1ZSwgbmEucm09VFJVRSkpDQoNCm1lYW5zIDwtIHRpZHlyOjpwaXZvdF93aWRlcihtZWFucywgbmFtZXNfZnJvbSA9IGdyb3VwLCB2YWx1ZXNfZnJvbSA9IG1lYW4pIHw+DQogICAgZHBseXI6Om11dGF0ZShGQ19PQ0lBRDEgPSBUT1RBTFNfT0NJQUQxX0tPIC0gVE9UQUxTX09DSUFEMV9XVCkNCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3Igdm9sY2FubyBwbG90DQpGQyA8LSBtZXJnZShtZWFucywgbGZxKQ0KRkMgPC0gRkMgfD4gZHBseXI6Om11dGF0ZShnZW5lID0gcHJvdGVpbi5ncm91cHMkYEdlbmUgbmFtZXNgKQ0KDQp0b192b2xjYW5vIDwtIG1lcmdlKEZDLHB2YWx1ZSkNCnRvX3ZvbGNhbm8kc2lnX1RPVEFMU19PQ0lBRDEgPC0gaWZlbHNlKGFicyh0b192b2xjYW5vJEZDX09DSUFEMSk+RkMuY3V0b2ZmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3ZvbGNhbm8kcF9PQ0lBRDFfVE9UQUxTPHAuY3V0b2ZmLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzID0gVFJVRSwgbm8gPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciB2MX0NCiMgcGxvdHRpbmcgdGhlIHZvbGNhbm8gcGxvdA0KdiA8LSBnZ3Bsb3QoZGF0YT10b192b2xjYW5vLCBhZXMoeD1GQ19PQ0lBRDEsIHk9LWxvZzEwKHBfT0NJQUQxX1RPVEFMUyksIGNvbG9yPXNpZ19UT1RBTFNfT0NJQUQxLCBsYWJlbD1nZW5lKSkgKyANCiAgICBnZW9tX3BvaW50KCkgKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgbGluZXR5cGUgPSAyLCBhbHBoYT0wLjUpICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtbG9nMTAoMC4wNSksIGxpbmV0eXBlID0gMiwgYWxwaGE9MC41KSArDQogICAgbGFicyh0aXRsZT0nVm9sY2FubyBwbG90IGZvciBOb24tSW1wdXRlZCBEYXRhJywgeD0nbG9nMihmb2xkIGNoYW5nZSknLCBjb2xvcj0nU2lnbmlmaWNhbmNlJywgeT0nLWxvZzEwKHAtdmFsdWUpJykgKw0KICAgIHRoZW1lX2J3KCkNCg0KIyBhZGQgaW50ZXJhY3RpdmUgbGFiZWxzDQpwbG90bHk6OmdncGxvdGx5KHYsIHRvb2x0aXAgPSBjKCdsYWJlbCcpKQ0KYGBgDQoNCiMjIyBNYXRpIENvZGUNCg0KYGBge3IgZmMgaW1wIGRhdGF9DQojIFByZXBhcmluZyBkYXRhIGZvciBjYWxjdWxhdGlvbnMNCmxmcV9pbXAgPC0gY2JpbmQuZGF0YS5mcmFtZShsZnFfaW1wLCBwcm90ZWluLmlkcz1wcm90ZWluLmdyb3VwcyRgUHJvdGVpbiBJRHNgKQ0KbGZxX2xvbmdfaW1wIDwtIGxmcV9pbXAgfD4NCiAgICB0aWR5cjo6cGl2b3RfbG9uZ2VyKDE6NiwgbmFtZXNfdG8gPSAnc2FtcGxlJywgdmFsdWVzX3RvID0gJ0xGUXZhbHVlJykNCg0KIyBBZGQgYSBuZXcgY29sdW1uIHdpdGggZ3JvdXBzIEtPIG9yIFdUDQpsZnFfbG9uZ19pbXAkZ3JvdXAgPC0gJ1RPVEFMU19PQ0lBRDFfS08nDQpsZnFfbG9uZ19pbXAkZ3JvdXBbZ3JlcCgnV1QnLGxmcV9sb25nX2ltcCRzYW1wbGUpXSA8LSAnVE9UQUxTX09DSUFEMV9XVCcNCg0KIyBDYWxjdWxhdGlvbiBvZiBtZWFucyBmb3IgZ3JvdXBzIEtPIGFuZCBXVA0KbWVhbnMgPC0gbGZxX2xvbmdfaW1wIHw+DQogICAgZHBseXI6Omdyb3VwX2J5KGdyb3VwLCBwcm90ZWluLmlkcykgfD4NCiAgICBkcGx5cjo6c3VtbWFyaXNlKG1lYW49bWVhbihMRlF2YWx1ZSwgbmEucm09VFJVRSkpDQoNCm1lYW5zIDwtIHRpZHlyOjpwaXZvdF93aWRlcihtZWFucywgbmFtZXNfZnJvbSA9IGdyb3VwLCB2YWx1ZXNfZnJvbSA9IG1lYW4pIHw+DQogICAgZHBseXI6Om11dGF0ZShGQ19PQ0lBRDEgPSBUT1RBTFNfT0NJQUQxX0tPIC0gVE9UQUxTX09DSUFEMV9XVCkNCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3Igdm9sY2FubyBwbG90DQpGQyA8LSBtZXJnZShtZWFucywgbGZxX2ltcCkNCkZDIDwtIEZDIHw+IGRwbHlyOjptdXRhdGUoZ2VuZSA9IHByb3RlaW4uZ3JvdXBzJGBHZW5lIG5hbWVzYCkNCg0KdG9fdm9sY2FubyA8LSBtZXJnZShGQyxwdmFsdWVfaW1wKQ0KdG9fdm9sY2FubyRzaWdfVE9UQUxTX09DSUFEMSA8LSBpZmVsc2UoYWJzKHRvX3ZvbGNhbm8kRkNfT0NJQUQxKT5GQy5jdXRvZmYmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fdm9sY2FubyRwX09DSUFEMV9UT1RBTFM8cC5jdXRvZmYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMgPSBUUlVFLCBubyA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyIHYyfQ0KIyBwbG90dGluZyB0aGUgdm9sY2FubyBwbG90DQp2IDwtIGdncGxvdChkYXRhPXRvX3ZvbGNhbm8sIGFlcyh4PUZDX09DSUFEMSwgeT0tbG9nMTAocF9PQ0lBRDFfVE9UQUxTKSwgY29sb3I9c2lnX1RPVEFMU19PQ0lBRDEsIGxhYmVsPWdlbmUpKSArIA0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PWMoLTEsIDEpLCBsaW5ldHlwZSA9IDIsIGFscGhhPTAuNSkgKw0KICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1sb2cxMCgwLjA1KSwgbGluZXR5cGUgPSAyLCBhbHBoYT0wLjUpICsNCiAgICBsYWJzKHRpdGxlPSdWb2xjYW5vIHBsb3QgZm9yIEltcHV0ZWQgRGF0YSAtIE1hdGkgQ29kZScsIHg9J2xvZzIoZm9sZCBjaGFuZ2UpJywgY29sb3I9J1NpZ25pZmljYW5jZScsIHk9Jy1sb2cxMChwLXZhbHVlKScpICsNCiAgICB0aGVtZV9idygpDQoNCiMgYWRkIGludGVyYWN0aXZlIGxhYmVscw0KcGxvdGx5OjpnZ3Bsb3RseSh2LCB0b29sdGlwID0gYygnbGFiZWwnKSkNCmBgYA0KDQojIyMgUmFuZG9tIEZvcmVzdA0KDQpgYGB7ciBmYyBSRiBkYXRhfQ0KIyBQcmVwYXJpbmcgZGF0YSBmb3IgY2FsY3VsYXRpb25zDQppbXB1dGVkX1JGIDwtIGNiaW5kLmRhdGEuZnJhbWUoaW1wdXRlZF9SRiwgcHJvdGVpbi5pZHM9cHJvdGVpbi5ncm91cHMkYFByb3RlaW4gSURzYCkNCmltcHV0ZWRfbG9uZ19SRiA8LSBpbXB1dGVkX1JGIHw+DQogICAgdGlkeXI6OnBpdm90X2xvbmdlcigxOjYsIG5hbWVzX3RvID0gJ3NhbXBsZScsIHZhbHVlc190byA9ICdMRlF2YWx1ZScpDQoNCiMgQWRkIGEgbmV3IGNvbHVtbiB3aXRoIGdyb3VwcyBLTyBvciBXVA0KaW1wdXRlZF9sb25nX1JGJGdyb3VwIDwtICdUT1RBTFNfT0NJQUQxX0tPJw0KaW1wdXRlZF9sb25nX1JGJGdyb3VwW2dyZXAoJ1dUJyxpbXB1dGVkX2xvbmdfUkYkc2FtcGxlKV0gPC0gJ1RPVEFMU19PQ0lBRDFfV1QnDQoNCiMgQ2FsY3VsYXRpb24gb2YgbWVhbnMgZm9yIGdyb3VwcyBLTyBhbmQgV1QNCm1lYW5zIDwtIGltcHV0ZWRfbG9uZ19SRiB8Pg0KICAgIGRwbHlyOjpncm91cF9ieShncm91cCwgcHJvdGVpbi5pZHMpIHw+DQogICAgZHBseXI6OnN1bW1hcmlzZShtZWFuPW1lYW4oTEZRdmFsdWUsIG5hLnJtPVRSVUUpKQ0KDQptZWFucyA8LSB0aWR5cjo6cGl2b3Rfd2lkZXIobWVhbnMsIG5hbWVzX2Zyb20gPSBncm91cCwgdmFsdWVzX2Zyb20gPSBtZWFuKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoRkNfT0NJQUQxID0gVE9UQUxTX09DSUFEMV9LTyAtIFRPVEFMU19PQ0lBRDFfV1QpDQoNCiMgQWRkIGEgdHlwZSBvZiBtaXNzaW5nIHRvIHRoZSBkYXRhIGZyYW1lIHdpdGggbWVhbnMgZm9yIGdyb3VwcyBLTyBhbmQgV1QgDQptZWFucyRtaXNzaW5nbmVzcyA8LSBkZl9tbCRtaXNzaW5nbmVzc1tzZXEoMSwgbnJvdyhpbXB1dGVkX2xvbmdfUkYpLCBieT02KV0NCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3Igdm9sY2FubyBwbG90DQpGQyA8LSBtZXJnZShtZWFucywgaW1wdXRlZF9SRikNCkZDIDwtIEZDIHw+IGRwbHlyOjptdXRhdGUoZ2VuZSA9IHByb3RlaW4uZ3JvdXBzJGBHZW5lIG5hbWVzYCkNCg0KdG9fdm9sY2FubyA8LSBtZXJnZShGQywgcHZhbHVlX1JGKQ0KdG9fdm9sY2FubyRzaWdfVE9UQUxTX09DSUFEMSA8LSBpZmVsc2UoYWJzKHRvX3ZvbGNhbm8kRkNfT0NJQUQxKT5GQy5jdXRvZmYmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fdm9sY2FubyRwX09DSUFEMV9UT1RBTFM8cC5jdXRvZmYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMgPSBUUlVFLCBubyA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyIHYzfQ0KIyBQbG90dGluZyB0aGUgdm9sY2FubyBwbG90DQp2IDwtIGdncGxvdChkYXRhPXRvX3ZvbGNhbm8sIGFlcyh4PUZDX09DSUFEMSwgeT0tbG9nMTAocF9PQ0lBRDFfVE9UQUxTKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZT1zaWdfVE9UQUxTX09DSUFEMSwgbGFiZWw9Z2VuZSwgY29sb3I9bWlzc2luZ25lc3MpKSArIA0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PWMoLTEsIDEpLCBsaW5ldHlwZSA9IDIsIGFscGhhPTAuNSkgKw0KICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1sb2cxMCgwLjA1KSwgbGluZXR5cGUgPSAyLCBhbHBoYT0wLjUpICsNCiAgICBsYWJzKHRpdGxlPSdWb2xjYW5vIHBsb3QgZm9yIEltcHV0ZWQgRGF0YSAtIGstTmVhcmVzdCBOZWlnaGJvcnMnLCANCiAgICAgICAgIHg9J2xvZzIoZm9sZCBjaGFuZ2UpJywgY29sb3I9J01pc3NpbmcgVHlwZScsIHk9Jy1sb2cxMChwLXZhbHVlKScsIHNoYXBlPSdTaWduaWZpY2FuY2UnKSArDQogICAgdGhlbWVfYncoKQ0KDQojIEFkZCBpbnRlcmFjdGl2ZSBsYWJlbHMNCnBsb3RseTo6Z2dwbG90bHkodiwgdG9vbHRpcCA9IGMoJ2xhYmVsJywgJ2NvbG9yJykpDQpgYGANCg0KIyMjIGstTmVhcmVzdCBOZWlnaGJvcnMNCg0KYGBge3IgZmMga05OIGRhdGF9DQojIFByZXBhcmluZyBkYXRhIGZvciBjYWxjdWxhdGlvbnMNCmltcHV0ZWRfa05OIDwtIGNiaW5kLmRhdGEuZnJhbWUoaW1wdXRlZF9rTk4sIHByb3RlaW4uaWRzPXByb3RlaW4uZ3JvdXBzJGBQcm90ZWluIElEc2ApDQppbXB1dGVkX2tOTiA8LSBpbXB1dGVkX2tOTlstZHVwbGljYXRlcyxdDQppbXB1dGVkX2xvbmdfa05OIDwtIGltcHV0ZWRfa05OIHw+DQogICAgdGlkeXI6OnBpdm90X2xvbmdlcigxOjYsIG5hbWVzX3RvID0gJ3NhbXBsZScsIHZhbHVlc190byA9ICdMRlF2YWx1ZScpDQoNCiMgQWRkIGEgbmV3IGNvbHVtbiB3aXRoIGdyb3VwcyBLTyBvciBXVA0KaW1wdXRlZF9sb25nX2tOTiRncm91cCA8LSAnVE9UQUxTX09DSUFEMV9LTycNCmltcHV0ZWRfbG9uZ19rTk4kZ3JvdXBbZ3JlcCgnV1QnLGltcHV0ZWRfbG9uZ19rTk4kc2FtcGxlKV0gPC0gJ1RPVEFMU19PQ0lBRDFfV1QnDQoNCiMgQ2FsY3VsYXRpb24gb2YgbWVhbnMgZm9yIGdyb3VwcyBLTyBhbmQgV1QNCm1lYW5zIDwtIGltcHV0ZWRfbG9uZ19rTk4gfD4NCiAgICBkcGx5cjo6Z3JvdXBfYnkoZ3JvdXAsIHByb3RlaW4uaWRzKSB8Pg0KICAgIGRwbHlyOjpzdW1tYXJpc2UobWVhbj1tZWFuKExGUXZhbHVlLCBuYS5ybT1UUlVFKSkNCg0KbWVhbnMgPC0gdGlkeXI6OnBpdm90X3dpZGVyKG1lYW5zLCBuYW1lc19mcm9tID0gZ3JvdXAsIHZhbHVlc19mcm9tID0gbWVhbikgfD4NCiAgICBkcGx5cjo6bXV0YXRlKEZDX09DSUFEMSA9IFRPVEFMU19PQ0lBRDFfS08gLSBUT1RBTFNfT0NJQUQxX1dUKQ0KDQojIEV4dHJhY3RpbmcgYSB0eXBlIG9mIG1pc3NpbmcgDQptaXNzX3R5cGVfa05OIDwtIGRmX21sIHw+IA0KICAgIGRwbHlyOjptdXRhdGUocm93ID0gcmVwKDE6bnJvdyhpbXB1dGVkX1JGKSwgZWFjaD02KSkgfD4NCiAgICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gcGFzdGUoY2VsbHR5cGUsIHNhbXBsZXR5cGUsIHJlcCwgc2VwPSdfJykpIHw+DQogICAgcmVzaGFwZTI6OmRjYXN0KHJvdyB+IGdyb3VwLCB2YWx1ZS52YXI9J21pc3NpbmduZXNzJykgfD4NCiAgICBkcGx5cjo6c2VsZWN0KC1yb3cpIHw+DQogICAgZHBseXI6Om11dGF0ZShtaXNzaW5nbmVzcyA9IEtPX1RPVEFMU18yMikgfD4gZHBseXI6OnNlbGVjdChtaXNzaW5nbmVzcykNCg0KIyBBZGQgYSB0eXBlIG9mIG1pc3NpbmcgdG8gdGhlIGRhdGEgZnJhbWUgd2l0aCBtZWFucyBmb3IgZ3JvdXBzIEtPIGFuZCBXVCANCm1lYW5zJG1pc3NpbmduZXNzIDwtIG1pc3NfdHlwZV9rTk5bLWR1cGxpY2F0ZXMsXQ0KDQojIFByZXBhcmluZyBkYXRhIGZvciB2b2xjYW5vIHBsb3QNCkZDIDwtIG1lcmdlKG1lYW5zLCBpbXB1dGVkX2tOTikNCkZDIDwtIEZDIHw+IGRwbHlyOjptdXRhdGUoZ2VuZSA9IHByb3RlaW4uZ3JvdXBzJGBHZW5lIG5hbWVzYFstZHVwbGljYXRlc10pDQoNCnRvX3ZvbGNhbm8gPC0gbWVyZ2UoRkMsIHB2YWx1ZV9rTk4pDQp0b192b2xjYW5vJHNpZ19UT1RBTFNfT0NJQUQxIDwtIGlmZWxzZShhYnModG9fdm9sY2FubyRGQ19PQ0lBRDEpPkZDLmN1dG9mZiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b192b2xjYW5vJHBfT0NJQUQxX1RPVEFMUzxwLmN1dG9mZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcyA9IFRSVUUsIG5vID0gRkFMU0UpDQpgYGANCg0KYGBge3IgdjR9DQojIFBsb3R0aW5nIHRoZSB2b2xjYW5vIHBsb3QNCnYgPC0gZ2dwbG90KGRhdGE9dG9fdm9sY2FubywgYWVzKHg9RkNfT0NJQUQxLCB5PS1sb2cxMChwX09DSUFEMV9UT1RBTFMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlPXNpZ19UT1RBTFNfT0NJQUQxLCBsYWJlbD1nZW5lLCBjb2xvcj1taXNzaW5nbmVzcykpICsgDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9YygtMSwgMSksIGxpbmV0eXBlID0gMiwgYWxwaGE9MC41KSArDQogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWxvZzEwKDAuMDUpLCBsaW5ldHlwZSA9IDIsIGFscGhhPTAuNSkgKw0KICAgIGxhYnModGl0bGU9J1ZvbGNhbm8gcGxvdCBmb3IgSW1wdXRlZCBEYXRhIC0gay1OZWFyZXN0IE5laWdoYm9ycycsIA0KICAgICAgICAgeD0nbG9nMihmb2xkIGNoYW5nZSknLCBjb2xvcj0nTWlzc2luZyBUeXBlJywgeT0nLWxvZzEwKHAtdmFsdWUpJywgc2hhcGU9J1NpZ25pZmljYW5jZScpICsNCiAgICB0aGVtZV9idygpDQoNCiMgQWRkIGludGVyYWN0aXZlIGxhYmVscw0KcGxvdGx5OjpnZ3Bsb3RseSh2LCB0b29sdGlwID0gYygnbGFiZWwnLCAnY29sb3InKSkNCmBgYA0KDQojIyMgTHVkb3ZpYw0KDQpgYGB7ciBmYyBsdWRvdmljIGRhdGF9DQojIGV4dHJhY3QgcHJvdGVpbiBpZHMsIHRvIGJlIHN1cmUgdGhhdCB3ZSBnZXQgZ29vZCByb3dzDQppbXB1dGVkX3Byb3RzIDwtICBhcy5udW1lcmljKGdzdWIoJ3Byb3RfJywgJycsIGltcHV0ZWRfbHVkb3ZpYyRgUHJvdGVpbiBJRHNgKSkNCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3IgY2FsY3VsYXRpb25zDQppbXB1dGVkX2x1ZG92aWMgPC0gY2JpbmQuZGF0YS5mcmFtZShpbXB1dGVkX2x1ZG92aWMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVpbi5pZHM9cHJvdGVpbi5ncm91cHMkYFByb3RlaW4gSURzYFtpbXB1dGVkX3Byb3RzXSkNCmltcHV0ZWRfbG9uZ19sdWRvdmljIDwtIGltcHV0ZWRfbHVkb3ZpYyB8Pg0KICAgIHRpZHlyOjpwaXZvdF9sb25nZXIoMzo4LCBuYW1lc190byA9ICdzYW1wbGUnLCB2YWx1ZXNfdG8gPSAnTEZRdmFsdWUnKQ0KDQojIEFkZCBhIG5ldyBjb2x1bW4gd2l0aCBncm91cHMgS08gb3IgV1QNCmltcHV0ZWRfbG9uZ19sdWRvdmljJGdyb3VwIDwtICdUT1RBTFNfT0NJQUQxX0tPJw0KaW1wdXRlZF9sb25nX2x1ZG92aWMkZ3JvdXBbZ3JlcCgnV1QnLGltcHV0ZWRfbG9uZ19sdWRvdmljJHNhbXBsZSldIDwtICdUT1RBTFNfT0NJQUQxX1dUJw0KDQojIENhbGN1bGF0aW9uIG9mIG1lYW5zIGZvciBncm91cHMgS08gYW5kIFdUDQptZWFucyA8LSBpbXB1dGVkX2xvbmdfbHVkb3ZpYyB8Pg0KICAgIGRwbHlyOjpncm91cF9ieShncm91cCwgcHJvdGVpbi5pZHMpIHw+DQogICAgZHBseXI6OnN1bW1hcmlzZShtZWFuPW1lYW4oTEZRdmFsdWUsIG5hLnJtPVRSVUUpKQ0KDQptZWFucyA8LSB0aWR5cjo6cGl2b3Rfd2lkZXIobWVhbnMsIG5hbWVzX2Zyb20gPSBncm91cCwgdmFsdWVzX2Zyb20gPSBtZWFuKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoRkNfT0NJQUQxID0gVE9UQUxTX09DSUFEMV9LTyAtIFRPVEFMU19PQ0lBRDFfV1QpDQoNCiMgUHJlcGFyaW5nIGRhdGEgZm9yIHZvbGNhbm8gcGxvdA0KRkMgPC0gbWVyZ2UobWVhbnMsIGltcHV0ZWRfbHVkb3ZpYykNCkZDIDwtIEZDIHw+IGRwbHlyOjptdXRhdGUoZ2VuZSA9IHByb3RlaW4uZ3JvdXBzJGBHZW5lIG5hbWVzYFtpbXB1dGVkX3Byb3RzXSkNCg0KdG9fdm9sY2FubyA8LSBtZXJnZShGQywgcHZhbHVlX2x1ZG92aWMsIGJ5PSdQcm90ZWluIElEcycpDQp0b192b2xjYW5vJHNpZ19UT1RBTFNfT0NJQUQxIDwtIGlmZWxzZShhYnModG9fdm9sY2FubyRGQ19PQ0lBRDEpPkZDLmN1dG9mZiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b192b2xjYW5vJHBfT0NJQUQxX1RPVEFMUzxwLmN1dG9mZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcyA9IFRSVUUsIG5vID0gRkFMU0UpDQpgYGANCg0KYGBge3IgdjV9DQojIFBsb3R0aW5nIHRoZSB2b2xjYW5vIHBsb3QNCnYgPC0gZ2dwbG90KGRhdGE9dG9fdm9sY2FubywgYWVzKHg9RkNfT0NJQUQxLCB5PS1sb2cxMChwX09DSUFEMV9UT1RBTFMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlPXNpZ19UT1RBTFNfT0NJQUQxLCBsYWJlbD1nZW5lLCBjb2xvcj1taXNzaW5nbmVzcy54KSkgKyANCiAgICBnZW9tX3BvaW50KCkgKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgbGluZXR5cGUgPSAyLCBhbHBoYT0wLjUpICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtbG9nMTAoMC4wNSksIGxpbmV0eXBlID0gMiwgYWxwaGE9MC41KSArDQogICAgbGFicyh0aXRsZT0nVm9sY2FubyBwbG90IGZvciBJbXB1dGVkIERhdGEgLSBrLU5lYXJlc3QgTmVpZ2hib3JzJywgDQogICAgICAgICB4PSdsb2cyKGZvbGQgY2hhbmdlKScsIGNvbG9yPSdNaXNzaW5nIFR5cGUnLCB5PSctbG9nMTAocC12YWx1ZSknLCBzaGFwZT0nU2lnbmlmaWNhbmNlJykgKw0KICAgIHRoZW1lX2J3KCkNCg0KIyBBZGQgaW50ZXJhY3RpdmUgbGFiZWxzDQpwbG90bHk6OmdncGxvdGx5KHYsIHRvb2x0aXAgPSBjKCdsYWJlbCcsICdjb2xvcicpKQ0KYGBgDQoNCiMjIEVpZ2VuTVMgey50YWJzZXR9DQoNCiMjIyBOb24tSW1wdXRlZA0KDQpgYGB7ciBmYyBlaWdlbiByYXcgZGF0YX0NCiMgZXh0cmFjdCBwcm90ZWluIGlkcywgdG8gYmUgc3VyZSB0aGF0IHdlIGdldCBnb29kIHJvd3MNCmVpZ19wcm90cyA8LSBhcy5udW1lcmljKGdzdWIoJ3Byb3RfJywgJycscm93bmFtZXMoZWlnZW5fZGYpKSkNCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3IgY2FsY3VsYXRpb25zDQplaWdlbl9kZiA8LSBjYmluZC5kYXRhLmZyYW1lKGVpZ2VuX2RmLCBwcm90ZWluLmlkcz1wcm90ZWluLmdyb3VwcyRgUHJvdGVpbiBJRHNgW2VpZ19wcm90c10pDQplaWdlbl9kZl9sb25nIDwtIGVpZ2VuX2RmIHw+DQogICAgdGlkeXI6OnBpdm90X2xvbmdlcigxOjYsIG5hbWVzX3RvID0gJ3NhbXBsZScsIHZhbHVlc190byA9ICdMRlF2YWx1ZScpDQoNCiMgQWRkIGEgbmV3IGNvbHVtbiB3aXRoIGdyb3VwcyBLTyBvciBXVA0KZWlnZW5fZGZfbG9uZyRncm91cCA8LSAnVE9UQUxTX09DSUFEMV9LTycNCmVpZ2VuX2RmX2xvbmckZ3JvdXBbZ3JlcCgnV1QnLGVpZ2VuX2RmX2xvbmckc2FtcGxlKV0gPC0gJ1RPVEFMU19PQ0lBRDFfV1QnDQoNCiMgQ2FsY3VsYXRpb24gb2YgbWVhbnMgZm9yIGdyb3VwcyBLTyBhbmQgV1QNCm1lYW5zIDwtIGVpZ2VuX2RmX2xvbmcgfD4NCiAgZHBseXI6Omdyb3VwX2J5KGdyb3VwLCBwcm90ZWluLmlkcykgfD4NCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuPW1lYW4oTEZRdmFsdWUsIG5hLnJtPVRSVUUpKQ0KDQptZWFucyA8LSB0aWR5cjo6cGl2b3Rfd2lkZXIobWVhbnMsIG5hbWVzX2Zyb20gPSBncm91cCwgdmFsdWVzX2Zyb20gPSBtZWFuKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoRkNfT0NJQUQxID0gVE9UQUxTX09DSUFEMV9LTyAtIFRPVEFMU19PQ0lBRDFfV1QpDQoNCiMgUHJlcGFyaW5nIGRhdGEgZm9yIHZvbGNhbm8gcGxvdA0KRkMgPC0gbWVyZ2UobWVhbnMsIGVpZ2VuX2RmKQ0KRkMgPC0gRkMgfD4gZHBseXI6Om11dGF0ZShnZW5lID0gcHJvdGVpbi5ncm91cHMkYEdlbmUgbmFtZXNgW2VpZ19wcm90c10pDQoNCnRvX3ZvbGNhbm8gPC0gbWVyZ2UoRkMscHZhbHVlX2VpZ2VuKQ0KdG9fdm9sY2FubyRzaWdfVE9UQUxTX09DSUFEMSA8LSBpZmVsc2UoYWJzKHRvX3ZvbGNhbm8kRkNfT0NJQUQxKT5GQy5jdXRvZmYmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fdm9sY2FubyRwX09DSUFEMV9UT1RBTFM8cC5jdXRvZmYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMgPSBUUlVFLCBubyA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyIHYxIGVpZ2VufQ0KIyBwbG90dGluZyB0aGUgdm9sY2FubyBwbG90DQp2IDwtIGdncGxvdChkYXRhPXRvX3ZvbGNhbm8sIGFlcyh4PUZDX09DSUFEMSwgeT0tbG9nMTAocF9PQ0lBRDFfVE9UQUxTKSwgY29sb3I9c2lnX1RPVEFMU19PQ0lBRDEsIGxhYmVsPWdlbmUpKSArIA0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PWMoLTEsIDEpLCBsaW5ldHlwZSA9IDIsIGFscGhhPTAuNSkgKw0KICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1sb2cxMCgwLjA1KSwgbGluZXR5cGUgPSAyLCBhbHBoYT0wLjUpICsNCiAgICBsYWJzKHRpdGxlPSdWb2xjYW5vIHBsb3QgZm9yIE5vbi1JbXB1dGVkIERhdGEnLCANCiAgICAgICAgIHg9J2xvZzIoZm9sZCBjaGFuZ2UpJywgY29sb3I9J1NpZ25pZmljYW5jZScsIHk9Jy1sb2cxMChwLXZhbHVlKScpICsNCiAgICB0aGVtZV9idygpDQoNCiMgYWRkIGludGVyYWN0aXZlIGxhYmVscw0KcGxvdGx5OjpnZ3Bsb3RseSh2LCB0b29sdGlwID0gYygnbGFiZWwnKSkNCmBgYA0KDQojIyMgTWF0aSBDb2RlDQoNCmBgYHtyIGZjIGVpZ2VuIGltcCBkYXRhfQ0KIyBleHRyYWN0IHByb3RlaW4gaWRzLCB0byBiZSBzdXJlIHRoYXQgd2UgZ2V0IGdvb2Qgcm93cw0KZWlnX3Byb3RzIDwtIGFzLm51bWVyaWMoZ3N1YigncHJvdF8nLCAnJyxyb3duYW1lcyhlaWdlbl9kZl9pbXApKSkNCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3IgY2FsY3VsYXRpb25zDQplaWdlbl9kZl9pbXAgPC0gY2JpbmQuZGF0YS5mcmFtZShlaWdlbl9kZl9pbXAsIHByb3RlaW4uaWRzPXByb3RlaW4uZ3JvdXBzJGBQcm90ZWluIElEc2BbZWlnX3Byb3RzXSkNCmVpZ2VuX2RmX2xvbmdfaW1wIDwtIGVpZ2VuX2RmX2ltcCB8Pg0KICAgIHRpZHlyOjpwaXZvdF9sb25nZXIoMTo2LCBuYW1lc190byA9ICdzYW1wbGUnLCB2YWx1ZXNfdG8gPSAnTEZRdmFsdWUnKQ0KDQojIEFkZCBhIG5ldyBjb2x1bW4gd2l0aCBncm91cHMgS08gb3IgV1QNCmVpZ2VuX2RmX2xvbmdfaW1wJGdyb3VwIDwtICdUT1RBTFNfT0NJQUQxX0tPJw0KZWlnZW5fZGZfbG9uZ19pbXAkZ3JvdXBbZ3JlcCgnV1QnLGVpZ2VuX2RmX2xvbmdfaW1wJHNhbXBsZSldIDwtICdUT1RBTFNfT0NJQUQxX1dUJw0KDQojIENhbGN1bGF0aW9uIG9mIG1lYW5zIGZvciBncm91cHMgS08gYW5kIFdUDQptZWFucyA8LSBlaWdlbl9kZl9sb25nX2ltcCB8Pg0KICBkcGx5cjo6Z3JvdXBfYnkoZ3JvdXAsIHByb3RlaW4uaWRzKSB8Pg0KICBkcGx5cjo6c3VtbWFyaXNlKG1lYW49bWVhbihMRlF2YWx1ZSwgbmEucm09VFJVRSkpDQoNCm1lYW5zIDwtIHRpZHlyOjpwaXZvdF93aWRlcihtZWFucywgbmFtZXNfZnJvbSA9IGdyb3VwLCB2YWx1ZXNfZnJvbSA9IG1lYW4pIHw+DQogICAgZHBseXI6Om11dGF0ZShGQ19PQ0lBRDEgPSBUT1RBTFNfT0NJQUQxX0tPIC0gVE9UQUxTX09DSUFEMV9XVCkNCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3Igdm9sY2FubyBwbG90DQpGQyA8LSBtZXJnZShtZWFucywgZWlnZW5fZGZfaW1wKQ0KRkMgPC0gRkMgfD4gZHBseXI6Om11dGF0ZShnZW5lID0gcHJvdGVpbi5ncm91cHMkYEdlbmUgbmFtZXNgW2VpZ19wcm90c10pDQoNCnRvX3ZvbGNhbm8gPC0gbWVyZ2UoRkMsIHB2YWx1ZV9laWdlbl9pbXApDQp0b192b2xjYW5vJHNpZ19UT1RBTFNfT0NJQUQxIDwtIGlmZWxzZShhYnModG9fdm9sY2FubyRGQ19PQ0lBRDEpPkZDLmN1dG9mZiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b192b2xjYW5vJHBfT0NJQUQxX1RPVEFMUzxwLmN1dG9mZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcyA9IFRSVUUsIG5vID0gRkFMU0UpDQpgYGANCg0KYGBge3IgdjIgZWlnZW59DQojIHBsb3R0aW5nIHRoZSB2b2xjYW5vIHBsb3QNCnYgPC0gZ2dwbG90KGRhdGE9dG9fdm9sY2FubywgYWVzKHg9RkNfT0NJQUQxLCB5PS1sb2cxMChwX09DSUFEMV9UT1RBTFMpLCBjb2xvcj1zaWdfVE9UQUxTX09DSUFEMSwgbGFiZWw9Z2VuZSkpICsgDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9YygtMSwgMSksIGxpbmV0eXBlID0gMiwgYWxwaGE9MC41KSArDQogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWxvZzEwKDAuMDUpLCBsaW5ldHlwZSA9IDIsIGFscGhhPTAuNSkgKw0KICAgIGxhYnModGl0bGU9J1ZvbGNhbm8gcGxvdCBmb3IgSW1wdXRlZCBEYXRhIC0gTWF0aSBDb2RlJywgDQogICAgICAgICB4PSdsb2cyKGZvbGQgY2hhbmdlKScsIGNvbG9yPSdTaWduaWZpY2FuY2UnLCB5PSctbG9nMTAocC12YWx1ZSknKSArDQogICAgdGhlbWVfYncoKQ0KDQojIGFkZCBpbnRlcmFjdGl2ZSBsYWJlbHMNCnBsb3RseTo6Z2dwbG90bHkodiwgdG9vbHRpcCA9IGMoJ2xhYmVsJykpDQpgYGANCg0KIyMjIFJhbmRvbSBGb3Jlc3QNCg0KYGBge3IgZmMgZWlnZW4gUkYgZGF0YX0NCiMgZXh0cmFjdCBwcm90ZWluIGlkcywgdG8gYmUgc3VyZSB0aGF0IHdlIGdldCBnb29kIHJvd3MNCmVpZ19wcm90cyA8LSBhcy5udW1lcmljKGdzdWIoJ3Byb3RfJywgJycscm93bmFtZXMoZWlnZW5fZGZfUkYpKSkNCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3IgY2FsY3VsYXRpb25zDQplaWdlbl9kZl9SRiA8LSBjYmluZC5kYXRhLmZyYW1lKGVpZ2VuX2RmX1JGLCBwcm90ZWluLmlkcz1wcm90ZWluLmdyb3VwcyRgUHJvdGVpbiBJRHNgW2VpZ19wcm90c10pDQplaWdlbl9kZl9sb25nX1JGIDwtIGVpZ2VuX2RmX1JGIHw+DQogICAgdGlkeXI6OnBpdm90X2xvbmdlcigxOjYsIG5hbWVzX3RvID0gJ3NhbXBsZScsIHZhbHVlc190byA9ICdMRlF2YWx1ZScpDQoNCiMgQWRkIGEgbmV3IGNvbHVtbiB3aXRoIGdyb3VwcyBLTyBvciBXVA0KZWlnZW5fZGZfbG9uZ19SRiRncm91cCA8LSAnVE9UQUxTX09DSUFEMV9LTycNCmVpZ2VuX2RmX2xvbmdfUkYkZ3JvdXBbZ3JlcCgnV1QnLGVpZ2VuX2RmX2xvbmdfUkYkc2FtcGxlKV0gPC0gJ1RPVEFMU19PQ0lBRDFfV1QnDQoNCiMgQ2FsY3VsYXRpb24gb2YgbWVhbnMgZm9yIGdyb3VwcyBLTyBhbmQgV1QNCm1lYW5zIDwtIGVpZ2VuX2RmX2xvbmdfUkYgfD4NCiAgZHBseXI6Omdyb3VwX2J5KGdyb3VwLCBwcm90ZWluLmlkcykgfD4NCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuPW1lYW4oTEZRdmFsdWUsIG5hLnJtPVRSVUUpKQ0KDQptZWFucyA8LSB0aWR5cjo6cGl2b3Rfd2lkZXIobWVhbnMsIG5hbWVzX2Zyb20gPSBncm91cCwgdmFsdWVzX2Zyb20gPSBtZWFuKSB8Pg0KICAgIGRwbHlyOjptdXRhdGUoRkNfT0NJQUQxID0gVE9UQUxTX09DSUFEMV9LTyAtIFRPVEFMU19PQ0lBRDFfV1QpDQoNCiMgQWRkIGEgdHlwZSBvZiBtaXNzaW5nIHRvIHRoZSBkYXRhIGZyYW1lIHdpdGggbWVhbnMgZm9yIGdyb3VwcyBLTyBhbmQgV1QgDQptZWFucyRtaXNzaW5nbmVzcyA8LSBkZl9tbCRtaXNzaW5nbmVzc1tzZXEoMSwgbnJvdyhlaWdlbl9kZl9sb25nX1JGKSwgYnk9NildDQoNCiMgUHJlcGFyaW5nIGRhdGEgZm9yIHZvbGNhbm8gcGxvdA0KRkMgPC0gbWVyZ2UobWVhbnMsIGVpZ2VuX2RmX1JGKQ0KRkMgPC0gRkMgfD4gZHBseXI6Om11dGF0ZShnZW5lID0gcHJvdGVpbi5ncm91cHMkYEdlbmUgbmFtZXNgW2VpZ19wcm90c10pDQoNCnRvX3ZvbGNhbm8gPC0gbWVyZ2UoRkMsIHB2YWx1ZV9laWdlbl9SRikNCnRvX3ZvbGNhbm8kc2lnX1RPVEFMU19PQ0lBRDEgPC0gaWZlbHNlKGFicyh0b192b2xjYW5vJEZDX09DSUFEMSk+RkMuY3V0b2ZmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3ZvbGNhbm8kcF9PQ0lBRDFfVE9UQUxTPHAuY3V0b2ZmLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzID0gVFJVRSwgbm8gPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciB2MyBlaWdlbn0NCiMgUGxvdHRpbmcgdGhlIHZvbGNhbm8gcGxvdA0KdiA8LSBnZ3Bsb3QoZGF0YT10b192b2xjYW5vLCBhZXMoeD1GQ19PQ0lBRDEsIHk9LWxvZzEwKHBfT0NJQUQxX1RPVEFMUyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGU9c2lnX1RPVEFMU19PQ0lBRDEsIGxhYmVsPWdlbmUsIGNvbG9yPW1pc3NpbmduZXNzKSkgKyANCiAgICBnZW9tX3BvaW50KCkgKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgbGluZXR5cGUgPSAyLCBhbHBoYT0wLjUpICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtbG9nMTAoMC4wNSksIGxpbmV0eXBlID0gMiwgYWxwaGE9MC41KSArDQogICAgbGFicyh0aXRsZT0nVm9sY2FubyBwbG90IGZvciBJbXB1dGVkIERhdGEgLSBrLU5lYXJlc3QgTmVpZ2hib3JzJywgDQogICAgICAgICB4PSdsb2cyKGZvbGQgY2hhbmdlKScsIGNvbG9yPSdNaXNzaW5nIFR5cGUnLCB5PSctbG9nMTAocC12YWx1ZSknLCBzaGFwZT0nU2lnbmlmaWNhbmNlJykgKw0KICAgIHRoZW1lX2J3KCkNCg0KIyBBZGQgaW50ZXJhY3RpdmUgbGFiZWxzDQpwbG90bHk6OmdncGxvdGx5KHYsIHRvb2x0aXAgPSBjKCdsYWJlbCcsICdjb2xvcicpKQ0KYGBgDQoNCiMjIyBrLU5lYXJlc3QgTmVpZ2hib3JzDQoNCmBgYHtyIGZjIGVpZ2VuIGtOTiBkYXRhfQ0KIyBleHRyYWN0IHByb3RlaW4gaWRzLCB0byBiZSBzdXJlIHRoYXQgd2UgZ2V0IGdvb2Qgcm93cw0KZWlnX3Byb3RzIDwtIGFzLm51bWVyaWMoZ3N1YigncHJvdF8nLCAnJyxyb3duYW1lcyhlaWdlbl9kZl9rTk4pKSkNCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3IgY2FsY3VsYXRpb25zDQplaWdlbl9kZl9rTk4gPC0gY2JpbmQuZGF0YS5mcmFtZShlaWdlbl9kZl9rTk4sIHByb3RlaW4uaWRzPXByb3RlaW4uZ3JvdXBzJGBQcm90ZWluIElEc2BbZWlnX3Byb3RzXSkNCmVpZ2VuX2RmX2xvbmdfa05OIDwtIGVpZ2VuX2RmX2tOTiB8Pg0KICAgIHRpZHlyOjpwaXZvdF9sb25nZXIoMTo2LCBuYW1lc190byA9ICdzYW1wbGUnLCB2YWx1ZXNfdG8gPSAnTEZRdmFsdWUnKQ0KDQojIEFkZCBhIG5ldyBjb2x1bW4gd2l0aCBncm91cHMgS08gb3IgV1QNCmVpZ2VuX2RmX2xvbmdfa05OJGdyb3VwIDwtICdUT1RBTFNfT0NJQUQxX0tPJw0KZWlnZW5fZGZfbG9uZ19rTk4kZ3JvdXBbZ3JlcCgnV1QnLGVpZ2VuX2RmX2xvbmdfa05OJHNhbXBsZSldIDwtICdUT1RBTFNfT0NJQUQxX1dUJw0KDQojIENhbGN1bGF0aW9uIG9mIG1lYW5zIGZvciBncm91cHMgS08gYW5kIFdUDQptZWFucyA8LSBlaWdlbl9kZl9sb25nX2tOTiB8Pg0KICBkcGx5cjo6Z3JvdXBfYnkoZ3JvdXAsIHByb3RlaW4uaWRzKSB8Pg0KICBkcGx5cjo6c3VtbWFyaXNlKG1lYW49bWVhbihMRlF2YWx1ZSwgbmEucm09VFJVRSkpDQoNCm1lYW5zIDwtIHRpZHlyOjpwaXZvdF93aWRlcihtZWFucywgbmFtZXNfZnJvbSA9IGdyb3VwLCB2YWx1ZXNfZnJvbSA9IG1lYW4pIHw+DQogICAgZHBseXI6Om11dGF0ZShGQ19PQ0lBRDEgPSBUT1RBTFNfT0NJQUQxX0tPIC0gVE9UQUxTX09DSUFEMV9XVCkNCg0KIyBBZGQgYSB0eXBlIG9mIG1pc3NpbmcgdG8gdGhlIGRhdGEgZnJhbWUgd2l0aCBtZWFucyBmb3IgZ3JvdXBzIEtPIGFuZCBXVCANCm1lYW5zJG1pc3NpbmduZXNzIDwtIG1pc3NfdHlwZV9rTk5bLWR1cGxpY2F0ZXMsXQ0KDQojIFByZXBhcmluZyBkYXRhIGZvciB2b2xjYW5vIHBsb3QNCkZDIDwtIG1lcmdlKG1lYW5zLCBlaWdlbl9kZl9rTk4pDQpGQyA8LSBGQyB8PiBkcGx5cjo6bXV0YXRlKGdlbmUgPSBwcm90ZWluLmdyb3VwcyRgR2VuZSBuYW1lc2BbZWlnX3Byb3RzXSkNCg0KdG9fdm9sY2FubyA8LSBtZXJnZShGQywgcHZhbHVlX2VpZ2VuX2tOTikNCnRvX3ZvbGNhbm8kc2lnX1RPVEFMU19PQ0lBRDEgPC0gaWZlbHNlKGFicyh0b192b2xjYW5vJEZDX09DSUFEMSk+RkMuY3V0b2ZmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3ZvbGNhbm8kcF9PQ0lBRDFfVE9UQUxTPHAuY3V0b2ZmLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzID0gVFJVRSwgbm8gPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciB2NCBlaWdlbn0NCiMgUGxvdHRpbmcgdGhlIHZvbGNhbm8gcGxvdA0KdiA8LSBnZ3Bsb3QoZGF0YT10b192b2xjYW5vLCBhZXMoeD1GQ19PQ0lBRDEsIHk9LWxvZzEwKHBfT0NJQUQxX1RPVEFMUyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGU9c2lnX1RPVEFMU19PQ0lBRDEsIGxhYmVsPWdlbmUsIGNvbG9yPW1pc3NpbmduZXNzKSkgKyANCiAgICBnZW9tX3BvaW50KCkgKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgbGluZXR5cGUgPSAyLCBhbHBoYT0wLjUpICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtbG9nMTAoMC4wNSksIGxpbmV0eXBlID0gMiwgYWxwaGE9MC41KSArDQogICAgbGFicyh0aXRsZT0nVm9sY2FubyBwbG90IGZvciBJbXB1dGVkIERhdGEgLSBrLU5lYXJlc3QgTmVpZ2hib3JzJywgDQogICAgICAgICB4PSdsb2cyKGZvbGQgY2hhbmdlKScsIGNvbG9yPSdNaXNzaW5nIFR5cGUnLCB5PSctbG9nMTAocC12YWx1ZSknLCBzaGFwZT0nU2lnbmlmaWNhbmNlJykgKw0KICAgIHRoZW1lX2J3KCkNCg0KIyBBZGQgaW50ZXJhY3RpdmUgbGFiZWxzDQpwbG90bHk6OmdncGxvdGx5KHYsIHRvb2x0aXAgPSBjKCdsYWJlbCcsICdjb2xvcicpKQ0KYGBgDQoNCiMjIyBMdWRvdmljDQoNCmBgYHtyIGZjIGVpZ2VuIGx1ZG92aWMgZGF0YX0NCiMgZXh0cmFjdCBwcm90ZWluIGlkcywgdG8gYmUgc3VyZSB0aGF0IHdlIGdldCBnb29kIHJvd3MNCmVpZ19wcm90cyA8LSBhcy5udW1lcmljKGdzdWIoJ3Byb3RfJywgJycscm93bmFtZXMoZWlnZW5fZGZfbHVkb3ZpYykpKQ0KDQojIFByZXBhcmluZyBkYXRhIGZvciBjYWxjdWxhdGlvbnMNCmVpZ2VuX2RmX2x1ZG92aWMgPC0gY2JpbmQuZGF0YS5mcmFtZShlaWdlbl9kZl9sdWRvdmljLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWluLmlkcz1wcm90ZWluLmdyb3VwcyRgUHJvdGVpbiBJRHNgW2VpZ19wcm90c10sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmduZXNzPWltcHV0ZWRfbHVkb3ZpYyRtaXNzaW5nbmVzcykNCmVpZ2VuX2RmX2xvbmdfbHVkb3ZpYyA8LSBlaWdlbl9kZl9sdWRvdmljIHw+DQogICAgdGlkeXI6OnBpdm90X2xvbmdlcigxOjYsIG5hbWVzX3RvID0gJ3NhbXBsZScsIHZhbHVlc190byA9ICdMRlF2YWx1ZScpDQoNCiMgQWRkIGEgbmV3IGNvbHVtbiB3aXRoIGdyb3VwcyBLTyBvciBXVA0KZWlnZW5fZGZfbG9uZ19sdWRvdmljJGdyb3VwIDwtICdUT1RBTFNfT0NJQUQxX0tPJw0KZWlnZW5fZGZfbG9uZ19sdWRvdmljJGdyb3VwW2dyZXAoJ1dUJyxlaWdlbl9kZl9sb25nX2x1ZG92aWMkc2FtcGxlKV0gPC0gJ1RPVEFMU19PQ0lBRDFfV1QnDQoNCiMgQ2FsY3VsYXRpb24gb2YgbWVhbnMgZm9yIGdyb3VwcyBLTyBhbmQgV1QNCm1lYW5zIDwtIGVpZ2VuX2RmX2xvbmdfbHVkb3ZpYyB8Pg0KICBkcGx5cjo6Z3JvdXBfYnkoZ3JvdXAsIHByb3RlaW4uaWRzKSB8Pg0KICBkcGx5cjo6c3VtbWFyaXNlKG1lYW49bWVhbihMRlF2YWx1ZSwgbmEucm09VFJVRSkpDQoNCm1lYW5zIDwtIHRpZHlyOjpwaXZvdF93aWRlcihtZWFucywgbmFtZXNfZnJvbSA9IGdyb3VwLCB2YWx1ZXNfZnJvbSA9IG1lYW4pIHw+DQogICAgZHBseXI6Om11dGF0ZShGQ19PQ0lBRDEgPSBUT1RBTFNfT0NJQUQxX0tPIC0gVE9UQUxTX09DSUFEMV9XVCkNCg0KIyBQcmVwYXJpbmcgZGF0YSBmb3Igdm9sY2FubyBwbG90DQpGQyA8LSBtZXJnZShtZWFucywgZWlnZW5fZGZfbHVkb3ZpYykNCkZDIDwtIEZDIHw+IGRwbHlyOjptdXRhdGUoZ2VuZSA9IHByb3RlaW4uZ3JvdXBzJGBHZW5lIG5hbWVzYFtlaWdfcHJvdHNdKQ0KDQp0b192b2xjYW5vIDwtIG1lcmdlKEZDLCBwdmFsdWVfZWlnZW5fbHVkb3ZpYykNCnRvX3ZvbGNhbm8kc2lnX1RPVEFMU19PQ0lBRDEgPC0gaWZlbHNlKGFicyh0b192b2xjYW5vJEZDX09DSUFEMSk+RkMuY3V0b2ZmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3ZvbGNhbm8kcF9PQ0lBRDFfVE9UQUxTPHAuY3V0b2ZmLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzID0gVFJVRSwgbm8gPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciB2NSBlaWdlbn0NCiMgUGxvdHRpbmcgdGhlIHZvbGNhbm8gcGxvdA0KdiA8LSBnZ3Bsb3QoZGF0YT10b192b2xjYW5vLCBhZXMoeD1GQ19PQ0lBRDEsIHk9LWxvZzEwKHBfT0NJQUQxX1RPVEFMUyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGU9c2lnX1RPVEFMU19PQ0lBRDEsIGxhYmVsPWdlbmUsIGNvbG9yPW1pc3NpbmduZXNzKSkgKyANCiAgICBnZW9tX3BvaW50KCkgKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgbGluZXR5cGUgPSAyLCBhbHBoYT0wLjUpICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtbG9nMTAoMC4wNSksIGxpbmV0eXBlID0gMiwgYWxwaGE9MC41KSArDQogICAgbGFicyh0aXRsZT0nVm9sY2FubyBwbG90IGZvciBJbXB1dGVkIERhdGEgLSBrLU5lYXJlc3QgTmVpZ2hib3JzJywgDQogICAgICAgICB4PSdsb2cyKGZvbGQgY2hhbmdlKScsIGNvbG9yPSdNaXNzaW5nIFR5cGUnLCB5PSctbG9nMTAocC12YWx1ZSknLCBzaGFwZT0nU2lnbmlmaWNhbmNlJykgKw0KICAgIHRoZW1lX2J3KCkNCg0KIyBBZGQgaW50ZXJhY3RpdmUgbGFiZWxzDQpwbG90bHk6OmdncGxvdGx5KHYsIHRvb2x0aXAgPSBjKCdsYWJlbCcsICdjb2xvcicpKQ0KYGBgDQoNCiMgQ29uY2x1c2lvbg0KDQpTdW1tYXJpemluZyBldmVyeXRoaW5nIGFib3ZlLCB3ZSBjYW4gc2FmZWx5IHNheSB0aGF0IHRoZSAqKkVpZ2VuTVMqKiBtZXRob2QgZ2l2ZXMgDQp0aGUgYmVzdCByZXN1bHRzLiBUaGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgdHdvIG5vcm1hbGl6YXRpb24gbWV0aG9kcyAoVlNOIGFuZCBFaWdlbk1TKSANCndlcmUgdGhlIGJlc3QgdW50aWwgdGhlIHZlcnkgZW5kLCBidXQgaW4gdGhlIHN0YXRpc3RpY2FsIG1ldHJpY3MgdGhlIEVpZ2VuTVMgbWV0aG9kIA0Kd29uLiBJdCZuYnNwO2lzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBjb3JyZWN0IHNoYXBlIG9mIHRoZSAqcC12YWx1ZSogcGxvdCB3YXMgb25seSBvYnRhaW5lZCANCmZvciB0aGUgZGF0YSBub3JtYWxpemVkIHdpdGggdGhlICoqRWlnZW5NUyoqIG1ldGhvZC4NCg0KQWJvdXQgdGhlIGltcHV0YXRpb24gbWV0aG9kLiANCg0KMS4gV2UgY2FuIHNhZmVseSBzYXkgdGhhdCB0aGUgKipSYW5kb20gRm9yZXN0KiogYWxnb3JpdGhtIGFuZCB0aGUgKipMdWRvdmljKiogbWV0aG9kIA0KaGFkIHRoZSBiZXN0IHBlcmZvcm1hbmNlLiANCjIuIFRoZSAqKmtOTioqIG1ldGhvZCBjb3JyZWN0cyB0aGUgc2hpZnQgaW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgS08gMjQgcmVwbGljYXRlcywgDQpidXQgaW4gdGhlIG5leHQgY2FsY3VsYXRpb25zIHdlIGRpc2NvdmVyIGEgc3RyYW5nZSB2YWx1ZSBpbiB0aGUgaW1wdXRlZCBkYXRhLiBJbiBmYWN0LCANCmluIHNvbWUgcm93cyB0aGUgdmFsdWVzIHdlcmUgdGhlIHNhbWUsIG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gY2FsY3VsYXRlIHRoZSB0LXRlc3QgDQphbmQgaW50cm9kdWNpbmcgYW4gZXJyb3IgaW4gdGhlIENWIGNhbGN1bGF0aW9ucy4gDQozLiBUaGUgbWV0aG9kIHRoYXQgc2FtcGxlcyB2YWx1ZXMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIGNhbGN1bGF0ZWQgb24gdGhlIHJhdyBkYXRhIA0KY3JlYXRlcyB0aGUgYWRkaXRpb25hbCBwZWFrIG9mIGNvbHVtbnMgdGhhdCBkb2Vzbid0IGFwcGVhciBpbiB0aGUgcmF3IG5vbi1pbXB1dGVkIGRhdGEuDQoNCi0tLQ0KDQojIFJlZmVyZW5jZXMNCg0KMS4gW0Egc3lzdGVtYXRpYyBldmFsdWF0aW9uIG9mIG5vcm1hbGl6YXRpb24gbWV0aG9kcyBpbiBxdWFudGl0YXRpdmUgbGFiZWwtZnJlZSBwcm90ZW9taWNzXShodHRwczovL2FjYWRlbWljLm91cC5jb20vYmliL2FydGljbGUvMTkvMS8xLzI1NjI4ODkpDQoyLiBbSG93IHRvIE5vcm1hbGl6ZSBEYXRhIGluIFIgZm9yIG15IERhdGE6IE1ldGhvZHMgYW5kIEV4YW1wbGVzXShodHRwczovL3JwdWJzLmNvbS96dWJhaXJpc2hhcTkvaG93LXRvLW5vcm1hbGl6ZS1kYXRhLXItbXktZGF0YSkNCjMuIFtFaWdlbk1TXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9laWdlbm1zLykNCjQuIFtOb3JtYWxpemF0aW9uIG9mIHBlYWsgaW50ZW5zaXRpZXMgaW4gYm90dG9tLXVwIE1TLWJhc2VkIHByb3Rlb21pY3MgdXNpbmcgc2luZ3VsYXIgdmFsdWUgZGVjb21wb3NpdGlvbl0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8xOTYwMjUyNC8pDQo1LiBbTWV0YWJvbG9taWNzIERhdGEgTm9ybWFsaXphdGlvbiB3aXRoIEVpZ2VuTVNdKGh0dHBzOi8vam91cm5hbHMucGxvcy5vcmcvcGxvc29uZS9hcnRpY2xlP2lkPTEwLjEzNzEvam91cm5hbC5wb25lLjAxMTYyMjEpDQoNCmBgYHtyIHRlc3QgSUNDLCBpbmNsdWRlPUZBTFNFfQ0KIyBNYXliZSB3ZSBzaG91bGQgY2FsY3VsYXRlIHRoZSBJQ0MgbGlrZSB0aGF0PyBEb24ndCBrbm93IPCfpJQNCg0KIyBpcnI6OmljYyhjYmluZCgyXkxGUV9LTywyXkxGUV9XVCkpJHZhbHVlDQojIGlycjo6aWNjKGNiaW5kKDJeTEZRX0tPLnN0YW5kYXJkLDJeTEZRX1dULnN0YW5kYXJkKSkkdmFsdWUNCiMgaXJyOjppY2MoY2JpbmQoMl5MRlFfS08ubWlubWF4LDJeTEZRX1dULm1pbm1heCkpJHZhbHVlDQojIGlycjo6aWNjKGNiaW5kKDJeTEZRX0tPLm1lZCwyXkxGUV9XVC5tZWQpKSR2YWx1ZQ0KIyBpcnI6OmljYyhjYmluZCgyXkxGUV9LTy5tYWQsMl5MRlFfV1QubWFkKSkkdmFsdWUNCiMgaXJyOjppY2MoY2JpbmQoMl5MRlFfS08ubG0sMl5MRlFfV1QubG0pKSR2YWx1ZQ0KIyBpcnI6OmljYyhjYmluZCgyXkxGUV9LTy52c24sMl5MRlFfV1QudnNuKSkkdmFsdWUNCiMgaXJyOjppY2MoY2JpbmQoMl5MRlFfS08uZWlnZW4sMl5MRlFfV1QuZWlnZW4pKSR2YWx1ZQ0KDQojIE9uIHNlY29uZCB0aG91Z2h0LCB3ZSBzaG91bGRuJ3QgYmVjYXVzZSB0aGUgTEZRIHZhbHVlcyBiZXR3ZWVuIEtPIGFuZCBXVCBhcmUgDQojIHNsaWdodGx5IGRpZmZlcmVudCBhbmQgd2UgdXNlZCB0aGUgbm9ybWFsaXphdGlvbiBtZXRob2QgdG8gZ3JvdXAgcmVwbGljYXRlcyBtb3JlDQojIHRpZ2h0LiBTbywgd2UgY2FsY3VsYXRlIGl0IGNvcnJlY3RseS4NCmBgYA==